我是websockets的新手。
在我的设置中,我有一个用Go(playground)
编写的简单的websocket服务器我创建一个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。这可能是对它的确认。
编辑:当goveHTTP函数返回时,包golang.org/x/net/websocket关闭websocket连接。默认情况下,websocket连接与处理程序的实例绑定。
答案 0 :(得分:1)
当处理程序函数返回时,在您的情况EchoServer
中,套接字将由http框架自动关闭。
由于您为循环开始一个go例程,将yahoo
响应写入客户端,EchoServer
函数将在有时间发送响应之前终止(并因此关闭套接字)。
解决方案是删除go例程的产生,然后在EchoServer
内进行循环。