簡體   English   中英

engine.io / engine.io-client:不會發生傳輸切換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM