javascript 在 onopen 事件中获取 websocket 错误

Posted

技术标签:

【中文标题】javascript 在 onopen 事件中获取 websocket 错误【英文标题】:javascript getting a websocket error on onopen event 【发布时间】:2017-05-22 21:47:56 【问题描述】:

我收到关于以下内容的错误:

在“WebSocket”上执行“发送”失败:仍处于 CONNECTING 状态。 在发送消息之前,我是否可以检查某个事件以确保套接字已完全连接。

我的代码如下:

        this.contextWS = new WebSocket(socketAddress);

        this.contextWS.onopen = () => 
            console.log('Websocket is open !!!');
            this.contextWS.send('payload');
        

我在这里犯了一个明显的错误吗?

【问题讨论】:

***.com/a/49533457/1359764 【参考方案1】:

MDN - WebSocket 描述之后:

当 WebSocket 连接建立时调用的事件监听器 readyState 更改为 OPEN;这表明连接是 准备发送和接收数据。该事件是一个简单的事件 命名为“开放”。

我会使用 onerror 事件处理程序来检查路上是否没有错误..

contextWS.onerror = function (event) 
   console.log(event.data);
;

... 和 onclose 事件处理程序来检查意外关闭连接的原因:

contextWS.onclose = function(event) 
      if (event.code == 1000) 
        console.log('WebSocket closed normally');
       else 
          console.log('WebSocket closed unexpectedly: ' + event.code);
      

这是所有可能的结果代码的列表 - MDN CloseEvent

您可以尝试将消息排队并在 readyState == 1 时发送。请查看类似问题的答案 - proxy function

【讨论】:

感谢您的回复,我也阅读了 MDN。我仍然不确定如何确保 websocket 完全连接。我看到 onopen 事件被触发,我尝试发送一条消息,这就是我看到错误的时候。唯一可以看到的其他事件是 onerror 和 onclose。两者都不是我需要的 onopen 事件处理程序似乎是正确的去处。我一直以这种方式使用 WebSocket。您能否更新您的示例代码并添加 send() 函数? 我已经更新了答案。有一个类似问题的链接。所描述的方法似乎是合理的。无论如何, onopen 应该像文档所说的那样工作,当事件发生时 readyState == OPEN 。我见过一些人说 onopen 有时会被调用两次——一次用于 readyState == 0,一次用于 readyState == 1。您能否在您的 onopen 处理程序中打印出 readyState ?我很好奇这种行为是否真的发生。 我看到 websocket 马上就关闭了,所以这是核心问题。感谢您为我指明正确的方向。

以上是关于javascript 在 onopen 事件中获取 websocket 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 websocket onopen 事件中访问 spring mvc 属性值?

Websocket 服务器问题:onOpen 命中客户端,但服务器 websocket 处理程序 OnOpen 和其他事件从未命中

Java websocket在onOpen函数中获取自定义标头

Javascript Websocket onopen未被调用

websocket并不总是在angularjs应用程序中触发onopen函数

Rails WebSocket 客户端永远不会触发 OnOpen