に複製データI持って、私はクライアントにファイルを送信するために使用しています次のコード:Javaのソケット - 最後の書き込み
private void sendFile(Socket client) throws Exception {
byte[] data = new byte[4096];
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
FileInputStream fis = new FileInputStream("test.txt");
while (fis.read(data, 0, data.length) != -1) {
dos.write(data);
}
fis.close();
dos.close();
}
ファイルサイズは後に異なっているということです私は発見だ問題転送。さらに調査すると、ファイルが最後のdos.write(data)
に複製されていることがわかりました。
例:
オリジナルファイル:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Cras dictum diam neque, eu dictum sem efficitur ut.
Ut eu hendrerit risus.
In dapibus vel lectus at egestas.
転送されたファイル:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Cras dictum diam neque, eu dictum sem efficitur ut.
Ut eu hendrerit risus.
In dapibus vel lectus at egestas.
Ut eu hendrerit risus.
In dapib
私はここにウィットの終わりだと私はすでにしようと数百の例を見てきましたこれを修正する。私はdos.flush()
を試して、読み取り値をdos.read(data)
に変更し、while
ループ状態を変更しました。非常に大きなファイルを転送することを期待していますので、ファイルを一度に読み込む必要はありません。
EDIT:
私はダウンロードをテストするために、コマンドラインからtelnet
とnetcat
の両方を使用してきました。読み込まれたバイトの最大数 -
あなたはrを確認する必要がありますリードとライトの両方からのeturn値。 readからの値は、どれくらい読み込まれ、安全に書き込めるかを示します。 writeからの値は、書き込まれた量を示し、再試行を促す可能性があります。 –