切断時にフェイルファストするように Java ソケットを構成しますか?
-
09-06-2019 - |
質問
サーバー上に Java クラスを使用して接続しているリスニング ポートがあり、 Socket
インターフェース、つまり
Socket mySocket = new Socket(host,port);
それから私はそれをつかみます OutputStream
, で飾ります。 PrintWriter
自動フラッシュモードでは、笑ってしまいますが、リスニングポートが閉じている場合を除きます。それから私は得ます
tcp4 0 0 *.9999 *.* LISTEN
tcp 0 0 127.0.0.1.45737 127.0.0.1.9999 CLOSE_WAIT
プログラムの問題を検出できないようです - を使用してみました isConnected()
ソケット上のメソッドを実行しましたが、接続が閉じられていることを認識していないようです。
次回ソケットに書き込むときに問題を認識し、再接続して問題を報告できるようにしたいと考えています。
アドバイスをお願いします。
皆さんありがとう
解決
短いタイムアウトを設定しますか?
する isOutputShutdown()
欲しいものは手に入らないの?
いつでも構築できます SocketWatcher
独自に起動するクラス Thread
そして空の文字列を繰り返し書き込もうとします。 Socket
それが起こるまで SocketClosedException
.
他のヒント
TCP で切断された接続を検出する唯一の信頼できる方法は、接続に書き込むことです。これにより、最終的に「接続リセット」IOException が発生します。ただし、バッファリングのため、切断後の最初の書き込みでは発生せず、後続の書き込みで発生します。これについては何もできません。
ソケットからの読み取りに別のスレッドを設定します。ソケットが閉じられるまでブロックされ、その後例外がスローされます。その例外をキャッチして、クローズをすぐに検出します。
所属していません StackOverflow