如何在发送后将websocket连接保持在OPEN readystate中?

时间:2016-11-20 23:12:08

标签: javascript node.js go websocket

我是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连接与处理程序的实例绑定。

1 个答案:

答案 0 :(得分:1)

当处理程序函数返回时,在您的情况EchoServer中,套接字将由http框架自动关闭。 由于您为循环开始一个go例程,将yahoo响应写入客户端,EchoServer函数将在有时间发送响应之前终止(并因此关闭套接字)。

解决方案是删除go例程的产生,然后在EchoServer内进行循环。