猿问

在 Go 中提供 websocket

我开始玩 websockets + go,好吧,我想我误解了 Go 中 websockets 的一些非常基本的东西。


我想简单地监听 websocket 连接并进行相应的处理。但是,我在 Go 中使用 websocket 看到的所有示例都提供了连接到 websocket 的网页,这是一个要求吗?


以下是我设置的基本回显服务器:


package main


import (

  "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


蝴蝶不菲
浏览 195回答 2
2回答

守着一只汪

我有一个类似的问题,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 通信),我认为如果原始标头不匹配,它也可以解决问题。
随时随地看视频慕课网APP

相关分类

Go
我要回答