-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

你的复制代码是错误的。您忽略了读取返回的计数,并假设它填满了缓冲区。不需要这样做。请参阅 Javadoc。

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

使用大于零的任何缓冲区大小,通常为 8192。在两端使用。

添加睡眠实际上是在浪费时间。

于 2013-09-11T23:20:41.420 回答