javascript - Chrome websockets,就绪状态始终为 0

标签 javascript html google-chrome websocket chromium

我想在网站上使用 websockets,所以首先我开发了一个非常简单的小 websocket 页面来测试它。

我有一个在本地主机上运行的 websocket 服务器,它基于 python Tornado“Chat”演示。由于某种原因,聊天演示应用程序运行完美,但我似乎无法将 websocket 与我自己的页面一起使用,尽管建立了某种形式的连接。

我正在使用最新的 Chromium 版本对此进行测试,因此实现了 Tornado 实现支持的 websockets 版本 13。

问题来了:

  1. 加载页面,执行js并向服务器发送升级请求
  2. 服务器接收请求和应答

因此,据我所知,Chrome 应该设置 readyState = 1 并且我应该能够从我的页面发送消息。

仅出于某种原因它不起作用,readyState 保持为 0,当然,如果我尝试发送消息,我会收到 INVALID_STATE_ERR。

这是标题:

要求:

GET ws://127.0.0.1:8000/chatsocket HTTP/1.1
Origin: http://127.0.0.1
Cookie: _xsrf=9f73731fc2d544df864ce777bef0775a
Connection: Upgrade
Host: 127.0.0.1:8000
Sec-WebSocket-Key: pkwlpY+TtxfgUrm3M4WtTQ==
Upgrade: websocket
Sec-WebSocket-Version: 13

响应:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: ur9KL2jBhYB38e2SgwOkjyBlQXk=

感谢任何帮助:)



--- 编辑 ---


所以我最后弄明白了,如果你遇到同样的问题,原因是:

WebSocket 的 readyState 在线程结束时更新!

所以运行这样的代码:

var ws = new WebSocket(stuff);
while(ws.readyState==0){};

将无限循环发送给浏览器...

运行代码如下:

var ws=new WebSocket(stuff);
do_other_stuf();

可能有效,但您将无法使用 WS。


如果应该在套接字打开后运行的代码使用套接字,则必须这样写:

var ws=new WebSocket(stuff);
ws.onopen = new function(){
    // some code that need WS to be open
}
// rest of the code that doesn't require WS to be open

更好的方法是使用异步调用让线程结束:

var ws = new WebSocket(stuff);
setTimeout(whatever,500);

function whatever(){
    if(ws.readyState==1){
        // The code you want to run after WS is open
    }
    else
        setTimeout(whatever,500);
}

最佳答案

为了在连接 WebSockets 时触发某些功能,请使用回调:

var socket = new WebSocket(...);

socket.onopen = function() {
    // socket is connected
};
socket.onerror = function() {
    // some error happened
};
socket.onmessage = function(evt) {
    // you get a message: evt.data
};

在这种情况下使用 readyState 是很糟糕的事情,尤其是当你不得不多次询问它时(这是不必要的)。

另外请注意,每个浏览器 vendor 实现的 WebSockets 都存在非常细微的差异(不幸的是),因此请确保在大多数浏览器中对其进行测试。

关于javascript - Chrome websockets,就绪状态始终为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15544396/

相关文章:

javascript - Mocha : promise 中的断言不起作用

javascript - 如何创建可调整大小的 div 作为搜索引擎

google-chrome - 为什么 woff2 不在 mimetype 目录中?

javascript - 为什么我不能使用完整的谷歌日历提要?

javascript - 如果 iteratee 函数返回 false,Lodash forEach 不会迭代整个对象

html - 我打印 MySQL 数据的 CGI 脚本有什么问题?

javascript - 链接未显示在保管箱选择器应用程序中

javascript - 使用 JavaScript 关闭 chrome-extension 通知

python - 如何停止由selenium远程驱动程序启动的chrome?

javascript - 在 forEach 上通过引用传递