dポイントプレゼントキャンペーン実施中!

JavaでSocket通信している状態で、物理LANを抜いたりして通信異常状態を起こしても、すぐには通信異常と検知できないようで、一定期間してからSocketExceptionなどを検知します。

現在、クライアントとサーバで常に受信し続け、各々で1秒毎にSocketでメッセージを相互に送っております。
その間で物理LANを抜いても、一定期間は送信しつづけるように見え(実際受信はされていない)、
一定時間を超えると、上記のようにSocketExceptionで例外検知します。

上記のようにSocket通信で通信異常状態の場合には即検知することは無理なのでしょうか?

A 回答 (1件)

はい。


通信経路全体をなにか特別な装置で監視するような仕組みでも
あれば話は別ですが、普通は、通信経路のどこかのLANケーブルが
抜けたからといってすぐにはSocketExceptionは検出されません。

通信経路は、一時的なパケットの紛失が発生する前提で作られて
おり、TCPプロトコルの中には紛失したパケットを再送する機能が
あります。これにより、一時的にLANケーブルが抜けても、
すぐにつなぎ直せば何事もなかったかのように、通信が継続できる
メリットがあります。簡単には障害にしないよう頑張っているということです。
つまり、この再送タイムアウトが発生するまで障害検出されません。

この時間を短くすることは、
http://support.microsoft.com/kb/170359/ja
のように設定変更で可能ですが、他のアプリケーションにも
影響しますので、アプリケーションの都合で変更するのは
お勧めしません。(これはネットワーク環境に応じて変更するものです)

自分のアプリケーションの都合で早めに障害検出をしたい場合は、
1秒毎にSocketでメッセージを相互に送っているとのことですから、
そのメッセージを一定時間以内に受信しなかったら障害とするよう、
自分が必要とする時間でパケットの受信をタイマ監視する処理を
追加すればよいと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!