web-dev-qa-db-ja.com

ソケット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)を使用して再接続しようとすると、接続は機能しなくなります。接続を機能させるにはどうすればよいですか?

35
Eric

さて、ここにはオプションがあります...

ソケット値を初めて初期化するときは、_io.connect_で接続する必要があります。

次回(一度disconnectを呼び出した後)、socket.socket.connect()で接続し直してください。

initSocketは次のようになります

_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
    }
} 
_
45
drinchev

すでに答えがあることは知っていますが、現時点ではノードでsocket.IOクライアントの再接続機能が壊れているため、ここに到着しました。

Githubリポジトリのアクティブなバグは、多くの人が接続の失敗時にイベントを取得しておらず、再接続が自動的に行われていないことを示しています。

これを回避するには、次のように手動の再接続ループを作成できます。

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
})
13

クライアント側の設定に従って再接続できます。

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

// 1.0 socket.io version
io.connect(SERVER_IP,{'forceNew':true });
6
Prasad Bhosale

これは古い質問ですが、私は最近これに苦労し、ここでつまずきました。 socket.ioの最新バージョン(> 2.0)には、 here で指摘されているように_socket.socket_プロパティがありません。

_socket.io-client 2.2.0_を使用していますが、ソケットは接続されているように見えますが(プロパティ_socket.connected = true_)、サーバーと通信していませんでした。

それを修正するために、私の解決策はsocket.close() and _socket.open_を呼び出すことでした。これらのコマンドは、強制的に切断と新しい接続を行います。

1
Aldo

Socket-ioの再接続に問題がありました。この場合は誰かを助けるかもしれません。このようなコードがありました:

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);
    });
});
0