我在WebSocket握手期间收到javascript错误'错误:' Connection'标题丢失'尝试连接旧浏览器上的socket.io websocket时(iPad 1移动版Safari,phantomjs)。据我所知,这是因为这些浏览器试图使用较旧的不支持的websocket协议标准连接到websocket(phantomjs发送的Sec-WebSocket-Key1和Sec-WebSocket-Key2没有Sec-WebSocket-Version作为握手错误的一部分)。
当websocket失败时,它应该尝试通过其他传输方法(xhr,jsonp)进行连接,但是在尝试websocket握手之后,socket.on(' connect')似乎永远不会触发这些传输较旧的协议。以下是我们已添加到客户端的一些调试输出。
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或phantomjs连接时,我在控制台中看到以下内容:
[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 。注意如果我从传输类型列表中删除websockets,那么xhr连接和socket.on('连接')会像你期望的那样触发。
在设置了一种传输方法的不兼容握手之后,是否应该调用socket.on(' connect')进行其他传输?或者是否期望开发人员在使用旧版websocket协议的浏览器时不必配置socket.io(不要尝试连接这些浏览器上的websockets)?
由于