2011-01-16 12 views
0

サーバーに「安定した」接続が必要です。サーバーへの「安定した」TCP接続が必要

  1. クライアントは、5(10、N)秒ごとにサーバーに接続しようとします。

  2. 正常に接続すると、クライアントはサーバーからデータを受信します。

  3. サービスの中断(サーバーのシャットダウンなど)の場合は、手順1に進みます。私はテスト方法

  1. を私は私が停止

  2. (クライアントがサーバーからデータを取得することを確認するために)クライアントを起動し、サーバーに

  3. を開始サーバー

  4. 約200回のクライアント試行を待ちますサーバーに接続します。

  5. サーバーを再起動します。

サーバーはデータを送信しますが、クライアントはデータを取得しません。 socket.connect(...)が成功しましたが、 socket.getInputStream().read(byte[])ではありません。のThreadブロックです。

//socket.setSoTimeout(500); 

が、その後input.read(..)TimeoutExceptionをスロー:私は、この行のコメントを解除した場合

しかし、サーバーはクライアントからデータを受信します。

どこが間違っていますか?おかげさまで クライアントコードの

パート:J2SEオン

private void initSocket() { 
    try { 
     if (socket == null || socket.isClosed() == true 
       || socket.isConnected() == false) { 
      socket = new Socket(); 
      // socket.setSoTimeout(500); 
      InetSocketAddress socketAddress = new InetSocketAddress("192.168.1.3" 
        , 12344); 
      notifyDataListener(4); 
      socket.connect(socketAddress, 500); 
      notifyDataListener(5); 
     } 
    } catch (Throwable t) { 
     System.err.println(t); 
    } 
} 

private void closeSocket() { 
    try { 
     if (socket != null && socket.isClosed() == false) { 
      socket.close(); 
     } 
    } catch (Throwable t) { 
     System.err.println(t); 
    } 
} 

private byte[] buffer = new byte[1024]; 

public void run() { 
    while (isActive) { 
     try { 
      notifyDataListener(1); 
      initSocket(); 
      InputStream input = socket.getInputStream(); 
      int length = input.read(buffer); 
      if (length < 0) { 
       throw new EOFException("Was got -1"); 
      } 
      notifyDataListener(2); 
     } catch (Throwable t) { 
      closeSocket(); 
      notifyDataListener(3); 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException ie) { 
      } 
     } 
    } 
} 

同じコードが正常に動作します。多くの間違った試行後に接続が修復されます。 Androidにはソケットの制限がありますが(FileDescriptior?)、それを受け取りますが、後で解放しないようです。

+0

私はあなたのコードを試してみましたが、私のデバイス上でうまく動作します(もちろん別のサービスアドレスを使用しています)。 – Shlublu

答えて

0

ファイルディスクリプタが不足している可能性がありますが、通常のデスクトップ設定よりもAndroidの方がはるかに低いですが、具体的な値は異なります。

これをコード化した方法では、ゴミが収集されるまでソケットはハングアップしますが、いくつかのプラットフォームではさらにOSレベルのソケットが即座に閉じるのではなく、ハングしているデータ。

まず、socket.close()コードをfinally {}ステートメントに移動すると、ガベージコレクションを待つのではなく、すぐにソケットが解放されます。

関連する問題