我是websockets的新手 .
在我的设置中,我有一个用Go编写的简单websocket服务器(playground)
我创建一个 WebSocket
对象,设置其 onmessage
回调并调用其 send
方法进行测试 .
var w = new WebSocket("ws://localhost:12345/echo")
w.onmessage = (msg) => {
console.log(msg.data)
}
w.onopen = () => {
w.send("Hello") // this fires OK
}
基于服务器代码我期望发生的是接收“Hello”消息并且每隔1.5秒向客户端发送“yahoo” . 实际发生的是“Hello”被发送,但是“雅虎”都没有通过它 . 它似乎在WebSocket.readystate的某个地方变为3(CLOSED) .
为了澄清,服务器接收并打印"Hello"然后实际每1.5秒触发"yahoo"消息,但此时连接已关闭,因此 onmessage
回调永远不会触发 .
我错过了什么或误解了什么?
编辑:横跨comparison github.com/gorilla vs. golang.org/x/net,声称golang.org/x/net websocket实现不支持pong . 这可能是对它的确认 .
编辑:包golang.org/x/net/websocket在处理程序ServeHTTP函数返回时关闭websocket连接 . 默认情况下,websocket连接绑定到处理程序的实例 .
1 回答
处理程序函数返回时,在您的情况下
EchoServer
,http框架将自动关闭套接字 . 由于你为循环开始一个go例程,将yahoo
响应写入客户端,EchoServer
函数将在有时间发送响应之前终止(并因此关闭套接字) .解决方案是删除go例程的产生,然后在
EchoServer
中执行循环 .