1

問題:TCPセグメントが破損しています。

SocketChannelで一連のByteBufferを何度も送信します。シーケンスは次のとおりです。

\r\n
length of chunk (example: fff)
\r\n
chunk data (rubbish, a 1000 - 5000 character long string)
\r\n
length of next chunk (example: fff)
\r\n
next chunk data (rubbish, a 1000 - 5000 character long string)

..。

パターンをご覧いただければ幸いです。ネットワークレベルのMTUは約1500であるため、「チャンクデータ」を介して送信するTCPセグメントを作成します。

セグメントの問題は次のとおりです。どういうわけか(?)、ランダム(?)、セグメント(そのペイロード)は、最初に「チャンクデータ」の残りのバイトではなく\ r\nで始まります。

たとえば、次のようになります。

(segment 1)
\r\n
length of chunk (example: fff)
\r\n
chunk data (456 bytes)

(segment 2)
\r\n
chunk data (remaining 156 bytes)
length of next
\r\n

それ以外の:

(segment 1)
\r\n
length of chunk (example: fff)
\r\n
chunk data (456 bytes)

(segment 2)
chunk data (remaining 156 bytes)
\r\n
length of next
\r\n

参加する\r\ nを含むByteBufferを除いて、私の「チャンクデータ」B​​yteBufferが正しく送信されたことを知って、Javaコードがそれを引き起こすことができるかどうかを知りたいです...どんな助けも歓迎します、ありがとうあなたの時間!

アンドリュー

4

2 に答える 2

3

読み取りまたは書き込みの結果を無視しているに違いありません。TCPはデータを失ったり破損したりすることはなく、SocketAPIやJavaネットワークライブラリも失われません。少なくとも、約22年間のネットワークプログラミングと14年間のJavaでは見たことがありません。

于 2011-03-30T23:23:22.290 に答える
0

これはネットワークの問題によるものではなく、コーディング方法によるものです。データをチャンクで読み書きしている場合、最後のチャンクが原因でデータが破損する可能性があります。最後に読み取られたデータチャンクが部分的に埋められ、バイト配列のデフォルト値が0になっている可能性があります。次の例は、その解決策を示しています

ObjectOutputStream out = new ObjectOutputStream(
                socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
//Something local returns DataInputStream from server
InputStream dataInputStream = local.downloadFile(fileToBeRead);
int chunkSize = 10000;
byte[] chunkByteArray = new byte[chunkSize];
int bytesRead = -1;
while ((bytesRead = dataInputStream.read(chunkByteArray)) != -1) {
    if (bytesRead < chunkSize) {
        System.out.println("Last Chunk is " + bytesRead);
        chunkByteArray = getLastChunkByteArray(bytesRead,chunkByteArray);
    }
    out.write(chunkByteArray);
}
            dataInputStream.close();

そしてその方法

private byte[] getLastChunkByteArray(int noOfBytesRead,
        byte[] partialFilledChunk) {

    byte[] lastChunk = new byte[noOfBytesRead];
    for (int i = 0; i < noOfBytesRead; i++) {
        lastChunk[i] = partialFilledChunk[i];
    }
    return lastChunk;
}

于 2013-04-26T18:01:57.700 に答える