在带有CORS的一个端口上运行&Socket.io HTTP + WSS?

Jor*_*man 0 go websocket cors socket.io

Go的新手。.显然仍在学习语法和基础知识..但是我确实有一个特定的目标。

我正在尝试在: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))
}
Run Code Online (Sandbox Code Playgroud)

在客户端,我仍然看到:

与“ wss://api.domain.com/socket.io/?EIO = 3&transport = websocket&sid = xNWd9aZvwDnZOrXkOBaC”的WebSocket连接失败:在建立连接之前关闭WebSocket。

(索引):1 XMLHttpRequest无法加载https://api.domain.com/socket.io/?EIO=3&transport=polling&t=1420662449235-3932&sid=xNWd9aZvwDnZOrXkOBaC。所请求的资源上没有“ Access-Control-Allow-Origin”标头。因此,不允许访问源“ http://fiddle.jshell.net ”。

编辑#1:

因此,我一直在努力尝试理解为什么我无法连接。.遇到了一个甚至更令人困惑的难题吗?

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

上面的要点是我的golang服务器的代码+用于连接的浏览器代码。此代码每秒将向后端发送30个HTTP GET请求,而无需连接,升级或给出任何错误(客户端或服务器端)。从本质上讲,DDOS是我自己的后端?

有人,请有人告诉我我在做一些愚蠢的事情。

编辑#2:

我可以通过简单地/在Go中调整socket.io端点的URL上的结尾来停止“ DDOS” 。因此:mux.Handle("/socket.io", server)to mux.Handle("/socket.io/", server)现在将产生错误消息和连接尝试,并带有以下错误响应:

WebSocket与'wss://api.domain.com/socket.io/?EIO = 3&transport = websocket&sid = 0TzmTM_QtF1TaS4exiwF'的连接失败:WebSocket握手期间出错:意外的响应代码:400 socket.io-1.2.1.js:2

GET https://api.domain.com/socket.io/?EIO=3&transport=polling&t=1420743204485-62&sid=0TzmTM_QtF1TaS4exiwF 400(错误请求)

Jor*_*man 5

所以我放弃了使用googoolee的Socket.io实现,而选择了大猩猩。

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

查看他们的文档:http : //www.gorillatoolkit.org/pkg/websocket- 在“原产地注意事项”下,我发现:

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

var upgrader = websocket.Upgrader {CheckOrigin:func(r * http.Request)bool {return true},}

我在他们的示例中将此CheckOrigin功能添加到了conn.go文件中,并且能够使CORS套接字服务器与浏览器通信。

作为Golang的第一次冒险,这很令人沮丧和有趣。.+1给其他人学习