-1

サーバーから大きなファイルを分割して送信しようとすると、一部のパッケージがクライアントに到着しません...コンソール出力でわかるように

http://s7.postimg.org/94yjfame3/error.png

クライアントは 19799.. バイトしか受信せず、サーバーは 62800.. バイトを送信しました。

コードは長すぎてここでは説明できません... しかし、基本は次のとおりです。

// server side -> send data

BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());

byte[] somePackageInfo= new byte[500];
byte[] streamOut = new byte[20000];

while(getDataFromLargeFile(somePackageInfo,streamOut) != 0) {

  out.write(somePackageInfo,0,500);
  out.write(streamOut);
  out.flush();

}

out.write(0);
out.flush();


// client side -> get data

BufferedInputStream in = new BufferedInputStream(socket.getInputStream());

byte[] somePackageInfo= new byte[500];
byte[] streamIn= new byte[20000];

while(true) {

  if(in.read(somePackageInfo,0,500) == 0) break;
  in.read(streamIn);
  saveDataToLargeFile(somePackageInfo,streamIn);
}

転送を遅くしようとしましたが ( )、ほとんどの荷物sleep(500)しか届きませんでした。

を削除しようとしましたflush()が、まだほとんどのパッケージしか到着しませんでした。

この問題の原因は何ですか?どうすれば修正できますか?

4

1 に答える 1

1

コピーコードが間違っています。read によって返されたカウントを無視しており、バッファがいっぱいになっていると想定しています。そうする必要はありません。Javadoc を参照してください。

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

ゼロより大きい任意のバッファー サイズ (通常は 8192) で使用します。両端で使用します。

睡眠を追加することは、文字通り時間の無駄です。

于 2013-09-11T23:20:41.420 に答える