2009-08-13 9 views
0

こんにちは私はネットワークがオフラインになったときを検出する方法に問題があります。 私のサーバーとクライアントは別のコンピュータにあります。実際に私はjavaでTCPソケットプログラミングを書いています。 サーバとクライアントの両方が接続されたら、何かを書いて10秒間スリープ状態にしたら、LANケーブルを外します。Javaソケットプログラミングを使用してネットワークダウンを知る方法

1分後にLANケーブルを差し込んだ。しかし、私はそのトランザクションをいつものようにサーバーとクライアントの間で行うことができます。

おかげ スニル・クマールSahoo

答えて

0

すべてがいつものようになった場合、私はあなたがコンピュータがオフラインになる心配はありません示唆しています。

それ以外の場合は、アプリケーションレベルで実装された「ping」が順番に実行されます。つまり、クライアントは単純なpingメッセージを送信し、サーバーからの応答を期待します。

1

TCPは2分間の接続損失に耐えます。失われたパケットはすべて再送信されます。これは設計によるものです。インターネットは核戦争に耐えなければならず、ネットワークハードウェアはネットが発明されたときにそれほど信頼できませんでした。

より速く知る必要がある場合は、小さなテストメッセージをサーバーに送信し、おそらく別のスレッドでタイムアウト(数秒以内に応答なし)を処理する必要があります。

3

あなたの質問が正しく理解できれば、ネットワークが遅いか完全にダウンしたかを素早く判断できる必要があります。

これは簡単なことではありません。

ここには2つの異なる状況があります。あなたのソースコンピュータ、または経路沿いのいくつかのルータは、あなたの目的地までのルートに永続的な問題があることを認識しています。あるいは、そのような認識はありません。

たとえば、要求を送信して応答を待つコンピュータからLANケーブルを引き出すと、ネットワークドライバは世界への接続が切断されたことを認識します。瞬時にエラーを通知します。これが最初の状況です。

一方、接続先のコンピュータからプラグを引き出すと、というコンピュータがダウンしていることが宛先ゲートウェイに認識されません。あなたの要求は宛先サブネット上で送信されますが、もちろん無視されます。これは第二の種類の状況です。

リモート障害(2番目の種類の問題)の場合、TCPスタックは最終的に宛先マシンが通信していないと判断します。しかし、それには数分かかります。これはシステム構成パラメータです。

私が知っている唯一の解決策は、妥当なタイムアウト(秒)で、非同期のオンザアプリケーションレベルのプロトコルと何らかの種類のハートビートメッセージを持つことです。

0

私が過去に行ったことは、繰り返しのJava Timerを使用する小さな接続モニタークラスを作成することです。タイマーがオフになると、次の3つの情報の接続を確認して接続の状態をチェックします:ifConnected(過去に接続されているかどうかを確認する)、!isClosed()(したがって、 )、isReachable()(宛先に到達できるか?)このような何か(例として使用し、ない溶液):

public static boolean isConnected = false; 
// pretend other stuff is properly declared in the surrounding class 

private class CxMonitor { 
    CxMonitor() { 
     javax.swing.Timer timer = new Timer(5000, new ActionListener() { 

     // what happens when the timer goes off 
     public void actionPerformed(ActionEvent e) { 
     isConnected = mySocket.isConnected() && 
         !mySocket.isClosed() && 
         InetAddress.getByName(severAddress).isReachable(1000); 
     } 
     } 

     timer.setRepeats(true); 
     timer.start(); 
    } 
} 

ソケット接続の状態を監視するために私を有効にしていること。次に、コードの他の部分で、isConnectedブール値の状態に基づいてアクションを実行します。

+0

Thnanks Dopyiii、本当にあなたが実装したこのロジックは本当に私を助けてくれました –

+0

それはあなたが始めることを願っています!ここのグランドデザインでは、「接続」のコレクションを持つシングルトンを持っていました。そうすれば、静的シングルトンはプログラムの存続期間中はアクティブなままです。各 "接続"オブジェクトには、このような状態を更新するスレッドタイマーがあります。過去には、オブジェクトのコレクションを繰り返し、その状態を尋ねるモニターシングルトンも作成しました。これを使用して、すべてのソケット接続の合計状態を判断することができました。理にかなっている? – Dave

+2

isConnectedおよびisClosedは、適切なメソッドを呼び出さない限り変更されません。非同期には変更されません。 isReachableは、ホストが到達可能であるが、サービス自体がダウンしている可能性があることをチェックします。 –

関連する問題