1

ソケットからデータを読み取る次のコードがあります。

byte[] data = new byte[dataLength];

if(dataLength > 2000000)FileManager.writeToLogFile(this.getClass(), "GetIncomingMessages", LogMessageType.DEBUG, "XXXXYYYY => 2 length: " + dataLength);

for(int i = 0 ; i < dataLength ; i++){
    byte[] temp = new byte[1];
    in.read(temp);
    data[i] = temp[0];
}

if(dataLength > 2000000)FileManager.writeToLogFile(this.getClass(), "GetIncomingMessages", LogMessageType.DEBUG, "XXXXYYYY => 3 length: " + dataLength);

このコードは、約 3MB (正確には 3227056 バイト) のサイズのパックを取得するまでは正常に機能します。このパケットを受信すると、例外は発生せず、プログラムがクラッシュすることもありませんが、コードがその時点を超えて進行することはありません。基本的に、上記の最後のログ エントリは作成されません。

この理由は何ですか?少なくともエラーが何であるかを理解するにはどうすればよいですか? (エラーはどの try-catch ブロックでもキャッチされません)。ただし、この時点を超えて発生する受信は他にもあります。

4

1 に答える 1

1

試す:

if( dataLength ) ...

int readBytes = 0;

while( readBytes < dataLength )
{
   readBytes += in.read( data, readBytes, dataLength-readBytes);
}

if( dataLength ) ...

これはスピードアップにつながるはずです。

これは実際には問題の解決策ではないことに注意してください。しかし、私は非効率的なループがその一部であると思います。うまくいけば、私たちはあなたのための解決策に到達するためにこの答えを編集することができます。

于 2012-10-15T09:55:32.080 に答える