0

我在服务器端写了这个:

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在服务器和客户端上使用相同的值时,它可以正常工作;即连接良好且快速且仅当 时才基于 websocket transports[0x0] === 'websocket',并且连接也良好且仅当 时才基于轮询transports[0x0] === 'polling'

一旦连接失败,就不会使用备用传输重试。

使用 engine.io 1.5.4。

4

1 回答 1

0

我找到了一种解决方法:编写我自己的协议切换器

这个想法是在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()和协议切换工作!

注意:此代码不负责错误检查。

于 2015-09-20T20:14:05.083 回答