我开始玩 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 通信),我认为如果原始标头不匹配,它也可以解决问题。
- 2 回答
- 0 关注
- 191 浏览
添加回答
举报
0/150
提交
取消