[英]engine.io / engine.io-client: transport switching does not occur
我在服務器端寫了這個:
var engine = require('engine.io'),
server = engine.listen(49157, {
transports: [ 'polling', 'websocket' ]
});
我寫了這個客戶端:
var socket = eio('ws://my.net:49157', {
transports: [ 'websocket', 'polling' ]
});
連接永遠不會成功! 只需嘗試1次,然后回調錯誤。
它應該在失敗時切換協議(從'websocket'
到'polling'
)。 為什么不進行協議切換? 我們如何才能使切換生效?
詳細資料 :
當我在服務器和客戶端上都使用相同的transports
值時, 它可以正常工作 ; 即,連接良好且快速,並且僅在transports[0x0] === 'websocket'
時才基於transports[0x0] === 'websocket'
,並且連接也良好且僅在transports[0x0] === 'polling'
時才基於transports[0x0] === 'polling'
。
連接一旦失敗,就不會使用備用傳輸進行重試。
使用engine.io 1.5.4。
我找到了一種解決方法: 編寫自己的協議切換器 !
這個想法是在transports
數組中對eio()
客戶端的每次調用僅使用一種協議。 因此,我們可以使用數組在協議失敗時遍歷協議。
我這樣寫:
// only on client side - server side stays untouched
var socket,
aTransports = ['polling', 'websocket'],
iCurrentTranport = 0x0;
function doConnect() {
"use strict";
socket = eio('ws://my.net:49157', {
transports: [ aTransports[iCurrentTranport++] ]
});
socket.on('open', function() {
console.log('-connected-');
socket.on('message', function(data){
console.log(data);
});
socket.on('close', function(){console.log('+disconnected+');});
});
socket.on('error', function(z) {
console.log('*error*', z);
if (iCurrentTranport > 1) { iCurrentTranport = 0x0; return; }
setTimeout(function () {
doConnect();
}, 500);
});
}
// start ws connection
doConnect();
僅調用doConnect()
和協議開關即可!
注意:此代碼不執行錯誤檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.