ホームページ > Java > &#&チュートリアル > Java の Socket API を使用して WebSocket 接続の終了を確実に検出するにはどうすればよいですか?

Java の Socket API を使用して WebSocket 接続の終了を確実に検出するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-18 17:43:14
オリジナル
703 人が閲覧しました

How Can I Reliably Detect WebSocket Connection Closures Using Java's Socket API?

Java Socket API: WebSocket の閉鎖の検出

Java の Socket API では、接続が閉じられているかどうかを判断するのが困難な場合があります。 isConnected() メソッドは、リモートで切断されたソケットに対しても true を返しますが、isClosed() はリモートで閉じられても false のままです。

従来のアプローチ

多くの開発者は継続的にガベージを書き込むことに頼っています。メッセージを出力ストリームに送信し、例外をチェックしてクロージャを検出します。ただし、この方法は非効率的であり、ネットワークを汚染します。

代替ソリューション

残念ながら、接続状態を明示的に報告する API はありません。代わりに、次のアプローチを使用して、ソケットが閉じられているかどうかを推測できます:

  1. 読み取り/書き込み操作: ピアが正常に接続を閉じた場合:

    • read() は -1 を返します
    • readLine() は返しますnull
    • 他の readXXX() メソッドは EOFException をスローします
    • 書き込みは最終的に「ピアによって接続がリセットされました」というメッセージを含む IOException を引き起こします
  2. 接続ドロップ: 接続が切断された場合突然:

    • 上記のように書き込みにより IOException が発生します
  3. 読み取りタイムアウト: ピアがまだ接続されている場合しかし非アクティブ:

    • 読み取りタイムアウトを使用して、通信の欠如を検出します
  4. チャネル管理: 一般的な考えに反して、ClosedChannelException は接続が閉じられていることを示すのではなく、使用後にチャネルが閉じられたことを示します。
  5. キーの有効性の選択: Windows XP 上の Java 7 では、無効になる選択されたキーselect() 値がゼロ以外であっても、ピアによって開始された接続リセットを示す可能性があります。

以上がJava の Socket API を使用して WebSocket 接続の終了を確実に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート