Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 损坏的大文件传输_Java_Sockets_Client Server - Fatal编程技术网

Java 损坏的大文件传输

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

当我试图通过拆分的方式从服务器发送一个大文件时,有些包无法到达客户端。。。正如您在控制台输出中看到的那样

客户只收到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()
,但仍然只有大部分包到达


导致此问题的原因是什么?如何解决此问题

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

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
用于任何大于零的缓冲区大小,通常为8192。在两端使用


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

显示您的
getData()
saveDataToLargeFile
方法。我认为这不是问题所在。。这些方法将数据读/写到文件中。如果您的文件损坏,则可能不正确。我确信这些函数工作正常,并且文件没有损坏。我认为您无法充分注意阅读我编写的内容。再试一次