2011-08-02 24 views
0

私はServerSocketを作成し、異なるクライアントからメッセージを読みました。クライアントの1人は、メッセージを送信した後にアプリケーションが正しく動作しないと主張していました。 TCPトレースを取得してメッセージを実際に送信したのを確認しましたが、サーバーアプリケーションはソケットからデータを読み取れませんでした。スレッドダンプが発生し、すべてが正常に処理されているようです。java - ソケットから読み取ることができない

"Reader Thread" daemon prio=3 tid=0x0ae8a000 nid=0x999 runnable [0x14525000] 
    java.lang.Thread.State: RUNNABLE 
     at java.net.SocketInputStream.socketRead0(Native Method) 
     at java.net.SocketInputStream.read(SocketInputStream.java:129) 

ストリームからメッセージを読み取れなかった原因は何でしょうか?他のクライアントは、この種の問題に苦しんでいません。

private byte[] readByte(int readCount) throws Exception { 
    int b; 
    int readedCount = readCount; 
    byte[] receiveBuffer = new byte[readCount]; 
    while(true) { 
     if(readCount > 0) { 
      b = inputStream.read(receiveBuffer, readCount - readedCount, readedCount); 
     } else { 
      b = 0; 
     } 
     if(b < 0) { 
      throw new UnrecoverableSocketException("Connection is Broken"); 
     } else { 
      readedCount = readedCount - b; 
     } 
     if(readedCount == 0) { 
      return receiveBuffer; 
     } 

    } 
} 
+0

ところで、私はTCPダンプでTCP ACKメッセージを見ることができます –

答えて

0

ほとんどのreadByte()メソッドは、DataInputStream.readFully()を使用して実装することができ、数百万回のテストの利点を得ることができます。

1

は、ストリームで実際に使用できるデータの量と一致しない可能性があります。あなたのクライアントが10バイトを送ったが、あなたが12を期待していたなら、あなたのコードは2つの余分なバイトを待つことになるでしょう。

+0

実際には、これはSMPPプロトコルの実装です。このプロトコルでは、クライアントはヘッダー情報である所定のバイト数を送信する必要があります。このヘッダーは、メッセージ全体に含まれるバイト数を示します。したがって、アプリケーションは残りのバイトを読み込もうとします。 wiresharkを使ってTCPダンプを調べたところ、メッセージは正しいようです。 –

関連する問題