2012-01-27 12 views
0

私のクライアントアプリケーションは、いくつかの状況で回復できる必要があります。 電源がオンになると、クライアントはファイルからアドレスとポートを読み取り、サーバーへの接続を試みます。 このクライアントで初めてこのクライアントが使用されている場合は、デフォルトのIPアドレスが試されますが、これは正しくない可能性があります。 その後、ユーザーは正しいIPアドレスを入力する必要があります。ポートはハードコードされています。 それが今で動作する方法は... 1秒swing.Timerは、サーバのステータスを取得しようとしている 強力なJavaソケットプログラミング

statusTimer = new Timer(ONE_SECOND, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     final byte GET_STATUS = 20; 
     SendCommand(GET_STATUS, null); 
    } 
}); 
statusTimer.start(); 

ユーザーが接続するように要求された接続がない場合は

...

private void SendCommand(byte command, byte[] parameters) { 
    if ((null == socket) || (null == outputStream) || socket.isClosed()) 
     if (JOptionPane.YES_OPTION == 
      JOptionPane.showConfirmDialog(null, "Connect?")) 
      Connect(); 
      ... 

private void Connect() { 
    String s = (String) 
     JOptionPane.showInputDialog(null, "Enter IP Address", ipAddress); 
    if (validateIp(s)) { 
     ipAddress = s; 
     connectTask = new ConnectTask(); 
     connectTask.start(); 
     ... 

ソケットが開かれ、ioストリームが設定され、RxThreadが開始されます。

class ConnectTask extends Thread { 
    @Override public void run() { 
     try { 
      if (null == socket) socket = new Socket(ipAddress, TCP_PORT); 
      if (null == outputStream) outputStream = socket.getOutputStream(); 
      if (null == inputStream) inputStream = socket.getInputStream(); 
      if (null == rxThread) rxThread = new RxThread(); 
      ... 

例えば、この時点で起こることができるいくつかの悪いものがあります:
1.クライアントをオンにすると、サーバーがオフである可能性があります。クライアントがソケットを自動的に開き、IOストリームを設定し、サーバの電源が入ってから続ける最善の方法は何ですか?
2.同様に、サーバーは読み込み中、書き込み中、またはどちらも実行されていない間に電源を切断することがあります。電源が復旧した後で自動的に回復する良い方法はありますか?
3.上記のようにIPアドレスを修正する必要がある場合があります。
ユーザーがクライアントアプリケーションを閉じたり開いたり、システムの電源を入れ直さなくても、これらの状況や他の状況を処理することはいいでしょう。 防弾Javaクライアントソケットにはどのようなアプローチが必要ですか?
Thisthisは、サーバソケットと似ていますが、契約している

あなたが初めての使用状況(サーバーの詳細が間違っている可能性があり、そしてユーザーが促されるべき時)以降の用法を区別できるようにする必要があります

答えて

1

(サーバーが停止している可能性があります)。たとえば、ユーザーが最初にIPを入力したときにファイルを保存することができます。

その後、おそらく、サーバーに接続してデータを読み取ろうとする内部ループと、タイムアウトのようなものが必要になります。ソケットがネットワークエラーのために閉じられた場合、これはtry-catchブロックで捕捉できます。このすべてを外側のループに入れて、切断されたときにもう一度やり直してください。

データの量が少ないと仮定して、クライアントは接続を維持しようとするより毎回接続を開いてから、接続の間にスリープするのが最も簡単です。

サーバーが応答しない場合は、現在のコード(タイマーを使用して毎秒新しいConnectTaskスレッドを作成する)によって、複数のConnectTaskが作成される可能性があります。あなたが投稿した部分コードからの確かなもの

関連する問題