Chrome websockets,就绪状态始终为0

时间:2013-03-21 10:03:06

标签: javascript html5 google-chrome websocket chromium

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

我有一个在我的localhost上运行的websocket服务器,它基于python Tornado“Chat”演示。由于某种原因,聊天演示应用程序运行完美,但我似乎无法使用websocket和我自己的页面,虽然有某种形式的连接。

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

所以这就是问题所在:

  1. 加载页面,执行js并将升级请求发送到服务器
  2. 服务器接收请求和答案
  3. 所以在我的理解中,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);
    }
    

1 个答案:

答案 0 :(得分:3)

为了在连接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是件坏事,特别是如果你不得不多次询问(只是不必要)。

另外考虑到每个浏览器供应商实现的WebSockets都有很小的差异(不幸的是),因此请确保在大多数浏览器中对其进行测试。