2012-05-03 13 views
28

一度ソケットioに再接続する方法disconnectが呼び出されましたか?ここでソケットIOを再接続しますか?

はコード

function initSocket(__bool){      
    if(__bool == true){    
     socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false});  
     socket.on('connect', function(){console.log('connected')});         
     socket.on('disconnect', function(){console.log('disconnected')}); 
    }else{ 
     socket.disconnect(); 
     socket = null; 
    } 
} 

私はinitSocket(true)を行う場合は、それが動作するのです。 initSocket(false)を実行すると、接続が切断されます。ただし、initSocket(true)を使用して再接続しようとすると、接続はもう機能しません。接続をどのようにして動作させることができますか?

+0

これはライブラリに組み込まれています。 http://stackoverflow.com/a/5149185/17803 – Matt

+0

[Node.jsとSocket.IOの可能な複製 - 接続が解除されるとすぐに再接続する方法を参照してください(http://stackoverflow.com/questions/4432271/node) -js-and-socket-io-how-to-reconnect-as-disconnect-as-disconnect-happensのように) – Matt

+5

私は切断時に再接続したくありません!私は接続と切断のタイミングを制御できるようにしたい。 – Eric

答えて

39

さて、あなたはここのオプションを持っている...

あなたがio.connectと接続する必要がありますソケット値を初期化する最初の時間、

次回(あなたが切断回呼び出さした後)、あなたはsocket.socket.connect()に接続し直す必要があります。

だからあなたinitSocketは、私はすでに答えを持って知っているが、socket.IOクライアントの再接続機能は、現時点でノードに壊れているので、私はここに到着

function initSocket(__bool){      
    if(__bool){   
     if (!socket) { 
      socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false});  
      socket.on('connect', function(){console.log('connected')});         
      socket.on('disconnect', function(){console.log('disconnected')}); 
     } else { 
      socket.socket.connect(); // Yep, socket.socket (2 times) 
     } 
    }else{ 
     socket.disconnect(); 
     // socket = null; <<< We don't need this anymore 
    } 
} 
12

のようなものでなければなりません。

github repoのアクティブなバグは、多くの人が接続失敗時にイベントを取得していないことを示し、再接続は自動的には起こりません。

は、次のように手動で再接続ループを作成することができ、これを回避するには:あなたは、クライアント側の設定に従うことによって、再接続することができ

var socketClient = socketioClient.connect(socketHost) 

var tryReconnect = function(){ 

    if (socketClient.socket.connected === false && 
     socketClient.socket.connecting === false) { 
     // use a connect() or reconnect() here if you want 
     socketClient.socket.connect() 
    } 
} 

var intervalID = setInterval(tryReconnect, 2000) 

socketClient.on('connect', function() { 
    // once client connects, clear the reconnection interval function 
    clearInterval(intervalID) 
    //... do other stuff 
}) 
5

// 0.9 socket.io version 
io.connect(SERVER_IP,{'force new connection':true }); 

// 1.0 socket.io version 
io.connect(SERVER_IP,{'forceNew':true }); 
+2

私は 'forceNew'が再接続を意味するとは思わない。通常は 'io.connect()'が同じソケットを2度目に呼び出した場合に返されるので、このステートメントが呼び出されるたびに新しいソケットを作成することを意味します。 –

0

私はsocket-ioの再接続に問題がありました。この場合、誰かを助けることができるかもしれません。開いているポート割り当てられたコールバックの間に遅延があるbecase

var io = require('socket.io').listen(8080); 
DB.connect(function() { 
    io.sockets.on('connection', function (socket) { 
     initSockets(socket); 
    }); 
}); 

これは、間違っている:私はこのようなコードを持っていました。 DBの初期化前にメッセージの一部が失われることがあります。それを修正する正しい方法は次のとおりです。

var io = null; 
DB.connect(function() { 
    io = require('socket.io').listen(8080); 
    io.sockets.on('connection', function (socket) { 
     console.log("On connection"); 
     initSockets(socket); 
    }); 
});