Websocket 在围棋中发球
我开始玩websockets+go,我想我误解了go中websockets的一些基本功能 我只想简单地侦听websocket连接并相应地进行处理。然而,我在使用websocket的Go中看到的所有示例都是为连接到websocket的网页提供服务,这是一个要求吗 以下是我已设置的基本echo服务器:Websocket 在围棋中发球,websocket,go,Websocket,Go,我开始玩websockets+go,我想我误解了go中websockets的一些基本功能 我只想简单地侦听websocket连接并相应地进行处理。然而,我在使用websocket的Go中看到的所有示例都是为连接到websocket的网页提供服务,这是一个要求吗 以下是我已设置的基本echo服务器: package main import ( "fmt" "code.google.com/p/go.net/websocket" "net/http" ) func webHandle
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从Javascript使用WebSocket时,很少需要直接读取帧。老实说,我甚至不知道该怎么做 幸运的是,websocket包已经有了一个类型,
Codec
,可以为您实现这一点。我的建议是使用预定义的websocket.Message编解码器来代替接收
和发送
消息
Message是一种编解码器,用于在WebSocket连接上发送/接收帧中的文本/二进制数据。要发送/接收文本框,请使用字符串类型。要发送/接收二进制帧,请使用[]字节类型
使用websocket.Message,您的webHandler将如下所示:
func webHandler(ws *websocket.Conn) {
var in []byte
if err := websocket.Message.Receive(ws, &in); err != nil {
return
}
fmt.Printf("Received: %s\n", string(in))
websocket.Message.Send(ws, in)
}
而且,不,Go服务于网页不是一项要求。您收到的403错误与Go或websocket软件包无关。我也有类似的问题,403错误问题与Go如何处理: 处理程序是WebSocket浏览器客户端的简单接口。默认情况下,它检查源标题是否为有效URL。您可能需要在func中验证websocket.Conn.Config().Origin。如果使用服务器而不是处理程序,则可以调用websocket.Origin并在握手函数中检查来源。所以,若你们想接受非浏览器客户端,它不发送源文件头,你们可以使用服务器。这不会在握手时检查原点 要禁用原点检查,您必须使用以下命令:
http.HandleFunc("/echo",
func (w http.ResponseWriter, req *http.Request) {
s := websocket.Server{Handler: websocket.Handler(webHandler)}
s.ServeHTTP(w, req)
});
至少这解决了我的问题(服务器到服务器的WebSocket通信),我认为如果原始标头不匹配,它也可以解决问题。if块中的中断意味着什么?@ElgsQianChen中断很可能是我的一个残余,首先将接收和发送放入for循环,以防止在收到第一条消息后断开连接。我把它改成了一个
return
。啊,我明白了。谢谢你的解释@ANisus。我也在寻找一种禁用交叉原产地检查的方法。src/ondemand/server.go:103:无法将func-literal(类型func(http.ResponseWriter,*http.Request))用作http.Handle的参数中的类型http.Handler。Handle:func(http.ResponseWriter,*http.Request)未实现http.Handler(缺少ServeHTTP方法),谢谢!这个解决方案不仅有效,而且完全符合我已有的解决方案!