损坏的大文件传输

时间:2013-09-11 20:35:12

标签: java sockets client-server

当我尝试通过拆分从服务器发送大文件时,某些软件包不会到达客户端......正如您在控制台输出中看到的那样

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()但仍然只有 的软件包到达。

是什么导致了这个问题,我该如何解决?

1 个答案:

答案 0 :(得分:1)

您的复制代码错误。您忽略了read返回的计数,并假设它填充了缓冲区。不要求这样做。见Javadoc。

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

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

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