当客户端尝试使用旧协议设置websocket时,socket.io如何工作?

我得到一个JavaScript错误'错误在WebSocket握手期间:'连接'标题丢失'当试图连接到一个旧的浏览器(iPad 1移动Safari浏览器,phantomjs)上的socket.io websocket。 据我所知这是因为这些浏览器试图连接到websocket使用较旧的不支持的websocket协议标准(phantomjs发送Sec-WebSocket-Key1和Sec-WebSocket-Key2没有Sec-WebSocket-Version作为握手错误的一部分)。

当websocket发生故障时,它应该尝试通过其他的传输方法(xhr,jsonp)进行连接,然而socket.on('connect')似乎从来没有为这些传输尝试websocket握手旧协议而触发。 以下是我们添加到客户端的一些debugging输出。

var socket = io.connect(); socket.on('connecting', function() { console.log('[Socket Client] Connecting to server using ' + socket.socket.transport.name + '(' + socket.socket.transport.sessid + ')'); }); socket.on('connect', function() { console.log('[Socket Client] Connected to server'); }); socket.on('connect_failed', function() { console.log('[Socket Client] Connection failed'); }); socket.on('reconnecting', function() { console.log('[Socket Client] Reconnecting...'); }); socket.on('reconnect_failed', function() { console.log('[Socket Client] Reconnection failed'); }); socket.on('error', function() { console.log('[Socket Client] Error occurred'); }); 

当我通过较旧的iPad或幻影连接时,在控制台中看到以下内容:

 [Socket Client] Connecting to server using websocket(R1v2JlqiGbPDSL4R_LeS) Error during WebSocket handshake: 'Connection' header is missing [Socket Client] Connecting to server using xhr-polling(R1v2JlqiGbPDSL4R_LeS) [Socket Client] Connecting to server using jsonp-polling(R1v2JlqiGbPDSL4R_LeS) [Socket Client] Connection failed 

这表明,所有的运输失败,但通过看着小提琴手,我看到多个成功的请求xhr和jsonp发射连接失败后。 注意如果我从传输types列表中删除websockets,那么xhr连接和socket.on('连接')会像您期望的那样触发。

socket.on('connect')是否在仅用一个传输方法设置的不兼容的握手之后被调用其他传输? 或者是否期望开发人员在使用旧版websocket协议的浏览器时configurationsocket.io(不要尝试连接这些浏览器上的websockets)?

谢谢