0

クライアント サーバー ソケット コードがあり、Windows 7 マシンと SUSE Linux ボックスの間でバイナリ ファイルを転送しています。ファイルを Win7 から Linux に転送すると、最終的に同じ MD5 チェックサムになるので、それらが同一であることがわかります。しかし、Linux から Win7 に転送すると、チェックサムが一致せず、ファイルが正しく転送されなかったことを示しています。

誰かがこれに遭遇しますか?私は ObjectOutputStreams と DataInputStreams を使用していますが、コードは両側で同じです。

 // connect socket to server socket, etc
//........

//=======================
// read the file
try {
size = file.length();
byteArr = new byte[(int) size];
dis = new DataInputStream(new FileInputStream(file));
dis.read(byteArr, 0, byteArr.length);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

//=======================
// then send it
try {
oos.writeObject(byteArr);
oos.flush();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

// then close oos, dis, etc
4

1 に答える 1

0

InputStream.read入力配列を満たすことは保証されていません。少なくとも 1 バイトが読み取られ、配列に収まらないか、ファイルの終わりに達した場合は 0 バイト、または IOException が保証されます。Linux では、一度にファイル全体を取得できない可能性があります。

また、バイト配列を埋めてからオブジェクトとして送信するのはなぜですか? ストリームはバイトのストリームとして概念化されているため、配列は必要ありません。

例えば。

int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];

FileInputStream input = new FileInputStream(file);

int read;
while ((read = input.read(buffer)) != -1) {
    output.write(buffer, 0, read);
}

// flush and close everything
于 2012-04-06T21:23:00.723 に答える