0

我有一个项目在同一页面上使用多个 HTML5 websocket 连接。当所有连接都可用时,页面将按预期运行。但是,当一个或多个 websocket 连接断开时,所有剩余的连接都会被阻塞,直到坏连接超时。超时后,剩余的 websocket 会按预期连接。

请注意uris下面的数组。我故意添加了一个错误的 websocket 地址来重新创建这个问题。当each循环触发时,第一个 uri 立即连接并更新lihtml 中的标签。然后,浏览器在第二个(坏)uri 上挂起长达 60 秒,然后最终移动到也立即连接的第三个 uri。

我能够在这里重新创建这个问题:http: //jsfiddle.net/eXZA6/2/

Javascript

var uris = {
    '1': 'ws://echo.websocket.org/', 
    '2': 'ws://echo.websocket.org:1234/', //Bad websocket address
    '3': 'ws://echo.websocket.org/'
};

var sockets = {};

$.each(uris, function(index, uri) {
    sockets[index] = connect(index, uri);
});

function connect(index, uri) {
    var websocket = new WebSocket(uri);

    websocket.onopen = function (evt) {
        $('li#' + index).text('Connected');
    };

    websocket.onclose = function (evt) {
        $('li#' + index).text('Closed');
    };

    websocket.onmessage = function (evt) {
    $('li#' + index).text('Received: ' + evt.data)
    };

    websocket.onerror = function (evt) {
        $('li#' + index).text('Error');
    };

    return websocket;
}

HTML

<ul id="connection">
    <li id="1" />
    <li id="2" />
    <li id="3" />
</ul>
  • 我尝试使用 setTimeout 和其他 hacky 多线程技巧,但没有成功。
  • 奇怪的是,我期望的功能似乎可以在 IE10 中使用,但不能在 Firefox 或 Chrome 中使用。
4

1 回答 1

1

听起来 Firefox 和 Chrome 遵循 WebSocket Spec RFC6455中列出的规则,而 IE10 则没有。

第 4.1 节:客户要求:

   2.  If the client already has a WebSocket connection to the remote
       host (IP address) identified by /host/ and port /port/ pair, even
       if the remote host is known by another name, the client MUST wait
       until that connection has been established or for that connection
       to have failed.  There MUST be no more than one connection in a
       CONNECTING state.  If multiple connections to the same IP address
       are attempted simultaneously, the client MUST serialize them so
       that there is no more than one connection at a time running
       through the following steps.

这实质上是说您遇到的行为是 websocket 客户端所需的行为,以便符合规范。

请注意“必须”一词的使用,这是规范文档中一个重要且定义明确的关键词。这个关键字以及其他关键字在第 2 节:一致性要求中特别提到。

于 2013-10-09T20:54:30.587 回答