【问题标题】:How to keep a websocket connection in OPEN readystate after send?发送后如何将 websocket 连接保持在 OPEN 就绪状态?
【发布时间】:2016-11-20 23:12:07
【问题描述】:

我是 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”,但没有一个“yahoo”通过。似乎 WebSocket.readystate 的某处变为 3(已关闭)。

澄清一下,服务器接收并打印“Hello”,然后实际上每 1.5 秒触发一次“yahoo”消息,但此时连接已关闭,因此onmessage 回调永远不会触发。

我是否遗漏或误解了什么?

编辑:遇到comparison github.com/gorilla vs. golang.org/x/net,声称 golang.org/x/net websocket 实现不支持 pong。这可能是对它的确认。

编辑:当处理程序 ServeHTTP 函数返回时,包 golang.org/x/net/websocket 关闭 websocket 连接。默认情况下,websocket 连接绑定到处理程序的实例。

【问题讨论】:

标签: javascript node.js go websocket


【解决方案1】:

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

解决方案是删除 go 例程的生成,只在 EchoServer 内执行循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2014-08-19
    • 2018-11-19
    • 2012-01-03
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多