2015-01-09 16 views
5

私は、サーバーから一定時間(20秒後など)のデータを送信しないソケットを切断するだけです。データが受信されない一定時間が経過した後にソケットを切断する

タイマーで作業するのが良いのか、それともソケットライブラリで特別なことがあるのでしょうか?すべてのソケットでサーバー上のタイマーを操作すると、重いものになります。

クライアントプログラムでこれを処理するのは危険ですか?例えば、すべてのクライアントはしばらくの間データを送信しないと切断します。

+0

すべてのアクティブなクライアントを定期的にチェックするタイマーは何ですか。データが受信されたときにクライアントごとの最後の受信時間を更新し、適切な同期を確保する必要があります。 –

+0

@AlexFarberかもしれません。 ttlはこれに対応していますか?これをどうすれば使えるの? – virtouso

+0

@AlexFarberサンプルコードを送ってください。ありがとうございました – virtouso

答えて

2

これはキープアライブチェックの一環として実装するのが非常に簡単です。接続が切断されたという問題を完全に無視しない限り、通信がない場合は、定期的にメッセージclient-> serverを送信するキープアライブシステムがあります。簡単な「最後のデータ受信時刻」値をソケット状態に追加し、DateTime.Nowからあまりにも遠すぎる場合はソケットを閉じるのは簡単です。

しかし、より重要な質問は「なぜですか?」です。最良の解決策は、これが最初の理由であるかどうかによって異なります。データを送信していないものをダンプして、より多くのクライアントにサーバーを使用可能にしたいですか? TCPソケットのタイムアウトは2〜4分ほどであるため、20秒後にクライアントを切断して再接続すると、1つではなく2つのサーバー側ポートが使用されます。おっとっと。

削除された回答についてのご意見は、and connection without data send and receive i think it gonna waste your threadsが実際の問題に近い点があります。サーバーの接続量は、サーバーがこれらの接続にサービスするために使用するスレッドの数とは関係ありません。オープンコネクションが「無駄にする」唯一のことは、基本的にはメモリ(接続ごとに必要なメモリ量とそのバッファでのソケットコストに応じて)とTCPポートです。これは一部のアプリケーションでは問題になる可能性がありますが、そのレベルの「負荷」に達していれば、既にあなた自身を祝福することができます。あなたは、他のリソースを使い果たす可能性が非常に高くなります。ポートリミットに近づく前に、あなたはMMOゲームを作っているように思えます。実際にこれらの問題に遭遇した場合は、とにかくTCPを落として、すべてをUDPで書き直したい(または、UDPの上にいくつかの解決策があることが好ましい)かもしれません。

+0

ありがとうございました。定期的にメッセージクライアント - >サーバーを送信するキープアライブシステムで、さらに通信がない場合はその逆の方法で詳しく説明しますか...特定の間隔で多数のクライアントにブロードキャストすることを意味しますか?それがあなたが意味することなら、〜20Kのオンラインユーザーのための良い回避策と考えることができますか? – revo

+1

@revoうん、確かに。もちろん、1台のサーバで20kオンラインユーザを使用するには、ネットワーク構成が必要です(最も重要なのは、サーバ上の一時的なポートの数を増やすことです)。そのため、要件を満たし、TCPが結局のところ良いアイデア。 UDP(例えば、Lindgren)の上にある素敵なネットワーキングライブラリは、あなたのニーズにもっと合っているかもしれません。 – Luaan

0

クライアント - サーバーモデルは、クライアントがサーバーに接続して要求を実行する方法を示します。 あなたがお勧めするのは、サーバーに接続し、必要な日付をすべて取得したら、(クライアント側の)ソケットを閉じます。

サーバーは最終的にソケットのリソースを解放したことを確認しますが、ソケットのConnectedプロパティがすぐにリソースを解放するのを確認できます。

+0

これはオンラインゲームなので、「すべてのデータ」の定義はありません。ユーザーが手動でログアウトするまで、接続は常に有効です。 – revo

0

クライアントがサーバーと切断すると、サーバーは切断イベントを取得できます。それはのように見える

socket.on('disconnect', function() { 
// Disconnect event handling 

}); 

あなたはまたあなたがサーバを再接続する必要がある切断イベントを見つける。

関連する問題