当前位置: 首页 > 知识库问答 >
问题:

走啦

蒋寒
2023-03-14

全新的。。显然还在学习语法和基础知识。。但我心里确实有一个明确的目标。。

我试图只是得到一个简单的服务器上: 8080,可以响应HTTP和socket.io(通过/socket.io/url),特别是与CORS。

我的代码:

package main

import (
     "log"         
     "net/http"
     "github.com/rs/cors"
     "github.com/googollee/go-socket.io"
 )

 func SayHelloWorld(w http.ResponseWriter, r *http.Request) {
     w.Write([]byte("Hello, World!"))
 }

 func main() {

   c := cors.New(cors.Options{
         AllowedOrigins: []string{"*"},
         AllowCredentials: true,
   })

   server, err := socketio.NewServer(nil)
     if err != nil {
         log.Fatal(err)
     }


   server.On("connection", func(so socketio.Socket) {
      log.Println("on connection")
      so.Join("chat")
      so.On("chat message", func(msg string) {
          log.Println("emit:", so.Emit("chat message", msg))
          so.BroadcastTo("chat", "chat message", msg)
      })
      so.On("disconnection", func() {
          log.Println("on disconnect")
      })
   })

   server.On("error", func(so socketio.Socket, err error) {
      log.Println("error:", err)
   })    


   http.Handle("/socket.io/", c.Handler(server))
   http.HandleFunc("/", SayHelloWorld)
   log.Println("Serving at localhost:8080...")
   log.Fatal(http.ListenAndServe(":8080", nil))
}

在客户端,我仍然看到:

WebSocket连接到'wss://api.domain.com/socket.io/?EIO=3

(索引):无法加载1 XMLHttpRequesthttps://api.domain.com/socket.io/?EIO=3

编辑#1:

所以我一直在绞尽脑汁想弄明白为什么我无法连接。。遇到了一个更令人困惑的难题?

https://gist.github.com/acoyfellow/167b055da85248c94fc4

以上要点是我Go语言服务器的代码浏览器用来连接的代码。这段代码将每秒向后端发送30个HTTP GET请求,而不会连接、升级或给出任何错误(客户端或服务器端)...

有人,请有人告诉我我在做蠢事。。这真是一道难题:P

编辑#2:

我可以通过简单地调整Go中socket.ioendpoint的URL上的尾随/来停止"DDOS"。所以:mux。处理("/socket.io",服务器)mux。句柄("/socket.io/",服务器)现在将产生错误消息和连接尝试,错误响应为:

WebSocket连接到'wss://api.domain.com/socket.io/?EIO=3

收到https://api.domain.com/socket.io/?EIO=3

共有3个答案

左宁
2023-03-14

CORS似乎不适用于WebSocket。根据WebSocket的“这个相关问题”,有一个“origin”标题,浏览器必须用包含打开WS连接的JS的HTML的来源来填充该标题

如本文所述:与Golang交叉来源的WebSocket

鲁鸿
2023-03-14

你不是指http ws或https wss吗。如果您从wss中删除了一个s,您应该能够连接。

如果你想要tls for web套接字(wss),那么你需要http。ListenAndServeTLS.

上官鸿朗
2023-03-14

所以我放弃了使用Goolee的插座。io实现,并与gorilla一起使用。

我查看了他们的示例:https://github.com/gorilla/websocket/tree/master/examples/chat

签出他们的文档:http://www.gorillatoolkit.org/pkg/websocket--根据原产地考虑,我发现:

应用程序可以通过指定始终返回true的函数来允许来自任何源的连接:

var upgrader=websocket。升级程序{CheckOrigin:func(r*http.Request)bool{return true},}

在他们的示例中,我将这个CheckOrigin函数添加到了conn.go文件中,并且能够获得与浏览器对话的CORS套接字服务器。

作为进入戈兰的第一次冒险,这是令人沮丧和有趣的

 类似资料:
  • Rust 的 async支持仍然是相当早期,并且仍在积极开发一些高-要求的功能,以及一些低标准的诊断程序。本章将讨论一些常见的痛点,并解释如何解决它们。

  • 向左滚动 <div id="marquee1" data-content="这是一句话" class="ui-marquee"></div> require(['jquery', 'moye/Marquee'], function ($, Marquee) { new Marquee({ main: document.getElementById('marquee1'),

  • 在有限空间内,循环播放同一类型的图片、文字等内容 基础用法 适用广泛的基础用法 结合使用el-carousel和el-carousel-item标签就得到了一个走马灯。幻灯片的内容是任意的,需要放在el-carousel-item标签中。默认情况下,在鼠标 hover 底部的指示器时就会触发切换。通过设置trigger属性为click,可以达到点击触发的效果。 <template> <div

  • Carousel 走马灯 在有限空间内,循环播放同一类型的图片、文字等内容 基础用法 适用广泛的基础用法 ::: demo 结合使用Carousel和Carousel.Item标签就得到了一个走马灯。幻灯片的内容是任意的,需要放在Carousel.Item标签中。默认情况下,在鼠标 hover 底部的指示器时就会触发切换。通过设置trigger属性为click,可以达到点击触发的效果。 rende

  • 在有限空间内,循环播放同一类型的图片、文字等内容 基础用法 适用广泛的基础用法 默认情况下,鼠标 click 底部的指示器时就会触发切换。 通过设置 trigger 属性为 hover,可以达到 hover 触发的效果 <!-- 你可以通过 [(model)] 来指定一个初始值 --> <!-- 同时获得所有值变更的推送 --> <el-carousel height="150px"> <el

  • Carousel 走马灯 在有限空间内,循环播放同一类型的图片、文字等内容 基础用法 适用广泛的基础用法 结合使用el-carousel和el-carousel-item标签就得到了一个走马灯。幻灯片的内容是任意的,需要放在el-carousel-item标签中。默认情况下,在鼠标 hover 底部的指示器时就会触发切换。通过设置trigger属性为click,可以达到点击触发的效果。 <temp

  • 客户端方面 分块 aiohttp现在不支持自定义分块大小了。至于分块的多大取决于开发者决定要放多少分块数据。如果chunking是允许的,aiohttp会将分块的内容以“Transfer-encoding: chunked”提供的格式编码。 aiohttp并不能自动编码分块内容,即使指定了transfer-encoding头信息也不行, 必须显式地设置chunked。如果设置了chunked,Tr

  • 本文向大家介绍一个人上楼,他有两种走法,走一阶或走两阶,问他上30阶楼梯有几种走法?相关面试题,主要包含被问及一个人上楼,他有两种走法,走一阶或走两阶,问他上30阶楼梯有几种走法?时的应答技巧和注意事项,需要的朋友参考一下 设上n级楼梯的走法为a(n),则a(n)的值等于是a(n-1)的值与a(n-2)的值的和,比如上5级楼梯的走法是4级楼梯走法和3级楼梯走法的和,因为走3到级时再走一次(2级)就