首页 文章

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

提问于
浏览
1

我是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 回答

  • 1

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

    解决方案是删除go例程的产生,然后在 EchoServer 中执行循环 .

相关问题