2011-12-21 19 views
0

私はJavaサーバーを持っています。クライアントはTCP経由でサーバーに接続します。 1クライアントがサーバに接続しています(クライアントは&クライアントb) 2クライアントはサーバと通信します 3 - "クライアントa"はインターネットから切断します 4-クライアントのソケット接続はありません接続を切断する 「クライアントa」が再びインターネットに接続すると、「クライアントa」はサーバーに接続せずにサーバーにメッセージを送信できます。クライアントとサーバー間の接続が終了しません

「クライアントa」がインターネットから切断されると、サーバーと「クライアントa」の間の接続が終了することが予想されます。

ご意見はありますか?

+0

「クライアント」が「インターネットに再び接続する」とは、クライアントが「サーバーに接続せずにサーバーにメッセージを送信できる」ということです。 –

+0

最初にすべてのクライアントがインターネットから切断され、インターネットに再び接続されます。クライアントがインターネットに接続した後、新しいソケットはクライアントとサーバーの間に開かれません。それは古いソケット接続が閉じていないように振る舞います(実際には閉じていないと思います)。したがって、クライアントはサーバーから切断されないため、サーバーにメッセージを送信できます。それは明確ですか? –

+0

はい、それは明らかです。ではなぜそれが問題なのですか?元の接続は決して壊れず、誰もそれを壊すための行動をとらなかった。断線を検出して接続を切断して応答する場合は、その接続が断線に耐えられる場合でも、それを行うことができます。しかし、それはほとんどの人が望むものではないので、デフォルトの動作ではありません。あなたが望むものをコーディングしてください。 –

答えて

2

まあ意見を持つとソリューションを持つ私は、サーバー側での接続にキープアライブタイムアウトを追加することをお勧めし

:-)二つの異なるものです。キープアライブレスポンスがない場合(数秒〜数分ですか?)、キープアライブ応答がない場合は、サーバ側で接続を終了してください。

+0

+1これはネットワーキングには必須であり、常に使用する必要があります – John

+0

あなたは正しいですか、実際には解決策が必要ですサーバ側でsthを実装して、数秒ごとにキープアライブ要求を送信するように指示し、この要求に対する応答がない場合、これはクライアントがサーバにもう接続されていないことを意味します。サーバーからクライアントに何らかのpingを実行していますか?右ですか? –

+0

はい、まさにそれです。応答がない場合は、それを強制終了してください。 – corsiKa

0

マシンがインターネットから切断されると、インターネット経由でデータを送信することはできません。これには、接続をクローズまたはアボートするために必要なパケットを送信することが含まれます。したがって、接続が切断された場合、クライアントが接続を閉じることができる方法はありません。これを行う必要がある場合、サーバーはそれを実行しなければなりません。この能力が必要な場合は、アプリケーションプロトコルがそれを提供する必要があります。

関連する問題