Java 损坏的大文件传输
当我试图通过拆分的方式从服务器发送一个大文件时,有些包无法到达客户端。。。正如您在控制台输出中看到的那样 客户只收到19799。。字节,服务器发送了62800。。字节 代码太长,无法在此通过。。。但基本情况如下:Java 损坏的大文件传输,java,sockets,client-server,Java,Sockets,Client Server,当我试图通过拆分的方式从服务器发送一个大文件时,有些包无法到达客户端。。。正如您在控制台输出中看到的那样 客户只收到19799。。字节,服务器发送了62800。。字节 代码太长,无法在此通过。。。但基本情况如下: // server side -> send data BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); byte[] somePackageInfo= new by
// 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()
,但仍然只有大部分包到达
导致此问题的原因是什么?如何解决此问题 您的复制代码错误。您将忽略读取返回的计数,并假设它已填充缓冲区。不需要这样做。请参阅Javadoc
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
用于任何大于零的缓冲区大小,通常为8192。在两端使用
添加睡眠实际上是浪费时间。显示您的
getData()
和saveDataToLargeFile
方法。我认为这不是问题所在。。这些方法将数据读/写到文件中。如果您的文件损坏,则可能不正确。我确信这些函数工作正常,并且文件没有损坏。我认为您无法充分注意阅读我编写的内容。再试一次