为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中提供 websocket

在 Go 中提供 websocket

Go
蝴蝶不菲 2021-06-30 06:09:03
我开始玩 websockets + go,好吧,我想我误解了 Go 中 websockets 的一些非常基本的东西。我想简单地监听 websocket 连接并进行相应的处理。但是,我在 Go 中使用 websocket 看到的所有示例都提供了连接到 websocket 的网页,这是一个要求吗?以下是我设置的基本回显服务器:package mainimport (  "fmt"  "code.google.com/p/go.net/websocket"  "net/http")func webHandler(ws *websocket.Conn) {  var s string  fmt.Fscan(ws, &s)  fmt.Println("Received: ", s)}func main() {  fmt.Println("Starting websock server: ")  http.Handle("/echo", websocket.Handler(webHandler))  err := http.ListenAndServe(":8080", nil)  if err != nil {    panic("ListenAndServe: " + err.Error())  }}这是用于连接的javascript:ws = new WebSocket("ws://localhost:8080/echo");ws.onmessage = function(e) {    console.log("websock: " + e.data);};然而,这会导致:WebSocket 连接到“ws://localhost:8080/echo”失败:意外响应代码:403
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

我有一个类似的问题,403 错误问题与 Go 如何处理http Origin 标头有关:


Handler 是一个简单的 WebSocket 浏览器客户端接口。默认情况下,它会检查 Origin 标头是否是有效的 URL。您可能想在 func 中验证 websocket.Conn.Config().Origin 。如果您使用 Server 而不是 Handler,您可以调用 websocket.Origin 并检查您的 Handshake func 中的来源。因此,如果您想接受不发送 Origin 标头的非浏览器客户端,则可以使用 Server 。不检查其握手中的来源。


为了禁用 Origin 检查,您必须使用以下内容:


http.HandleFunc("/echo",

    func (w http.ResponseWriter, req *http.Request) {

        s := websocket.Server{Handler: websocket.Handler(webHandler)}

        s.ServeHTTP(w, req)

    });

至少这为我解决了这个问题(服务器到服务器的 WebSocket 通信),我认为如果原始标头不匹配,它也可以解决问题。


查看完整回答
反对 回复 2021-07-05
  • 2 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信