2017-06-28 10 views
-1

ソケットIDがまだ接続されているかどうかをチェックしたいと思います。socket.io idがまだ接続されているかどうかをチェックインしてください。

socket.io私は<script src="/socket.io/socket.io.js"></script>のバージョンを使用しています。

私はいくつかのスレッドで回答を試みましたが、うまくいかなかった。

編集1:実際には、多くのクライアントに対応できる1台のサーバーがあります。サーバーでは、私はそれが接続されたクライアントへのソケットIDを送信し、次のコードを持っている:

io.sockets.on('connection', function (socket) { 
    console.log("LOG: just connected: " + socket.id);  
    socket.emit('id', socket.id);  
    socket.on('disconnect', function() { 
    console.log("LOG: just disconnected: " + socket.id) 
    }) 
}) 
2つのクライアントがサーバを経由してお互いに話も

が、それは、理由はClientAは、(独自のソケットID以外)ソケットIDはClientBのままにしてください。したがって、クライアントがまだ接続されている場合は、クライアント側で(idから)チェックすることは役に立ちます。このチェックがサーバーに尋ねる必要がある場合はOKですが、このチェックをできるだけ簡単で確実にしてください。

答えて

1

、クライアントAはclientBのsocket.idを持っており、クライアントAはclientBが現在接続しているかどうかを知りたいです。 socket.idは単なる文字列値なので、clientBが接続されているかどうかをclientAがちょうどsocket.idから通知する方法はありません。その情報はサーバーから取得する必要があります。

クライアントBは、(クライアントBのsocket.idをリクエストメッセージでサーバーに送信することによって)クライアントBが接続されていると思う場合、サーバーに問い合わせることができ、サーバーはクライアントBの接続状態に関する情報で応答できます。

サーバーは、接続されているすべてのクライアントの一覧を保持しています。そのリストにアクセスできる方法の1つは、socket.idによってインデックスされたマップを使用する方法です。したがって、接続されたクライアントが指定されたsocket.idを持つマップにあるかどうかをサーバーが簡単に確認できます。

ここでは、指定されたsocket.idが接続されているかどうかをサーバーに問い合わせる方法があります。クライアントが要求を送信し、応答を聞くなり、

io.sockets.on('connection', function (socket) { 
    console.log("LOG: just connected: " + socket.id);  
    socket.emit('id', socket.id);  
    socket.on('disconnect', function() { 
    console.log("LOG: just disconnected: " + socket.id) 
    }) 

    // use the ack function argument to send a response back 
    socket.on('isConnected', function(id, ackFn) { 
     let otherSocket = io.sockets.connected[id]; 
     ackFn(!!otherSocket && otherSocket.connected); 
    }); 
}); 

そして:これは、サーバーのコードになりますが、どのようにクライアントをすることができます求めていたと思っ

socket.emit('isConnected', someId, function(result) { 
    console.log(someId + ": " + result ? "is connected" : "is not connected"); 
}); 

オリジナルの答え独自のソケットが接続されているかどうかを確認します。

socket.ioオブジェクトには、ソケットの現在の接続状態を反映する.connectedプロパティがあります。

if (socket.connected) { 
    // socket.io thinks it is still connected 
} 

あなたはそれがここinternally in the .emit() method使用されて見ることができます:接続が機能停止したとき、それは通常、気づくよう

if (this.connected) { 
    this.packet(packet); 
} else { 
    this.sendBuffer.push(packet); 
} 

Socket.ioは、すでにサーバからクライアントに送信され、自身のハートビートを実装しています。デフォルトでは再接続を試みますが、再接続がすぐに機能しない場合、ソケットは切断された状態のままで、再接続を再試行します。

+0

私はソケットオブジェクトではなくソケットIDを持っているだけですか? – SoftTimur

+0

@SoftTimur - 'socket.id'はサーバー側のものですが、コードはクライアントサイドです。私は非常に混乱しています。このフラグを使用するには、クライアント側の 'socket'オブジェクトを取得する必要があります。さらなるヘルプが必要な場合は、より多くのコードを表示する必要があります。あなたが尋ねた特定の質問に私は答えました。あなたが今求めているのは何か他のものです。あなたが他のクライアントの 'socket.id'を持っていて、そのクライアントが接続されているかどうかを知りたければ、それはまったく異なる質問です。新しい質問を始めて、あなたがしようとしていることをすべて説明する関連するコード。 – jfriend00

+0

私の最初の質問は** id **についてです、それは確かにサーバー側からです。私はサーバーに接続状態を確認するように要求すべきではないと言っているわけではありません。私は自分のPCを持っているときにもっとコードを表示します。 – SoftTimur

1

30秒ごとにブロードキャストを送信することをお勧めします。この方法では、ソケットへの接続が緩くなりません。 (あなたのコメントから)どうやら

window.setInterval(function(){ 
    yoursocket.emit('broadcast'); 
}, 30000 /* 30 sec */); 
+0

私は切断を避けようとしていません(私は自分で接続を閉じるかもしれません)。ただIDがまだ接続されているかどうかをチェックしたいだけです。 – SoftTimur

+0

あなたが知っているこの方法でいいえ場合は、エラーが表示されます。 – Nicolas

+0

リアルタイムでそれをチェックする直接的な方法がないことはかなり奇妙です... – SoftTimur

関連する問題