2015-09-20 1 views
0

j'ai écrit ceci à côté serveur:engine.io/engine.io-client: commutation de transport ne se produit pas

var engine = require('engine.io'), 
    server = engine.listen(49157, { 
     transports: [ 'polling', 'websocket' ] 
    }); 

J'ai écrit ce côté client:

var socket = eio('ws://my.net:49157', { 
    transports: [ 'websocket', 'polling' ] 
}); 

Il ne réussit jamais à se connecter ! Juste 1 essayer alors l'erreur de rappels.

Il est supposé commuter le protocole (de 'websocket' à 'polling') en cas de défaillance. Pourquoi la commutation de protocole ne se produit pas? Comment pouvons-nous faire fonctionner ce changement?



Détails:

Lorsque j'utilise la même valeur transports tant sur serveur et le client, puis il fonctionne correctement; c'est-à-dire que la connexion est bon et rapide et est basé sur la WebSocket seulement si transports[0x0] === 'websocket', et la connexion est également bon et est basé sur l'interrogation seulement si transports[0x0] === 'polling'.

Dès que la connexion échoue, aucune nouvelle tentative n'est effectuée en utilisant un autre moyen de transport.

Utilisation de engine.io 1.5.4.

Répondre

0

J'ai trouvé une solution de contournement: pour coder mon propre commutateur de protocole!

L'idée est d'utiliser un seul protocole dans le tableau transports pour chaque appel au côté client eio(). Nous pouvons donc utiliser un tableau pour parcourir les protocoles sur les échecs de protocole.

j'ai écrit ceci:

// 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(); 

appeler uniquement doConnect() et le fonctionnement du commutateur de protocole!

Remarque: ce code ne prend pas en charge les contrôles d'erreur.

+0

est-ce encore nécessaire? – SuperUberDuper