サーバーはクライアントの接続が失われたことをどのように認識しますか? これはイベントをトリガーしますか?接続が失われる前にコードを実行できるように、コード (サーバー側) を保存することは可能ですか?
この接続損失は、次の場合に発生する可能性があります。
- アイドル時間が長すぎる。
- クライアント側が終了しました。
等
これは特に Jsp と php にお願いしています。
話しているプロトコルによって異なりますが、「接続」は通常、スリーウェイ ハンドシェイクによって確立されます。これは、両方の当事者が、ポートxで IP abcdへの開いている接続があり、この「接続」がどのコンテキストに関連付けられているかをテーブルで覚えていることを意味します。その「接続」からのすべての着信データは、関連付けられたコンテキストに渡されます。
それだけです。実際の「物理的な」接続はありません。それは、2 つの当事者の間で合意された状態にすぎません。
プロトコルによっては、適切なパケットで接続を正式に終了できます。一方がこのパケットを他方に送信し、「接続」が終了したことを伝えます。両当事者がテーブル エントリを削除するだけです。
このパケットが送信されずに接続が中断された場合、どちらの当事者もそれを知ることはありません。次に一方の当事者が他方の当事者にデータを送信しようとしたときにのみ、この問題が明らかになります。
プロトコルによっては、一定時間データを受信しなかった場合、接続が自動的に古くなったと見なされて終了する場合があります。この場合、切断された接続はすぐに通知されますが、両者の間で一定のやり取りが必要になります。
要するに、はい、トリガーできるサーバーイベントがありますが、トリガーされるとは限りません。
ソケットを閉じると、相手側のソケットに通知されます。ただし、不用意に接続が失われた場合 (ネットワーク ケーブルが抜かれたり、コンピュータの電源が失われた場合など) は、おそらく気付かないでしょう。
これに対処するために、接続を確認するためだけに定期的なメッセージを送信できます。送信が失敗した場合、接続は中断されています。ただし、妥当な時間だけ待機するようにソケットを設定してください。
典型的なクライアントサーバーアーキテクチャについて話している場合、サーバーはクライアントへの接続について気にするべきではありません。クライアントのみがサーバーへの接続について気にする必要があります。クライアントは、タイムアウトを回避するために定期的にキープアライブ メッセージを送信するなど、接続が切断されないようにするための手段を講じる必要があります。
サーバーが接続の切断/終了を気にする必要があるのはなぜですか。
サーバーの仕事は、クライアントからのリクエストを処理することです。それでおしまい。クライアントがサーバーから予期したデータを受信しない場合、適切なアクションを実行できます。サーバーがクライアントにデータを提供するための処理を行っているときに接続が切断された場合。また、クライアントによって http 要求が開始されるため、サーバーは多くのことを行うことができません。
したがって、何らかの理由で応答が得られなかった場合、クライアントは新しい要求を行うことができます。