当我尝试通过拆分从服务器发送大文件时,某些软件包不会到达客户端......正如您在控制台输出中看到的那样
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()
但仍然只有 的软件包到达。
是什么导致了这个问题,我该如何解决?
答案 0 :(得分:1)
您的复制代码错误。您忽略了read返回的计数,并假设它填充了缓冲区。不要求这样做。见Javadoc。
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
使用任何大于零的缓冲区大小,通常为8192.两端都使用。
添加睡眠实际上是浪费时间。