java - 为什么客户B 没有得到完整的文件

  显示原文与译文双语对照的内容
0 0

我正在尝试在 2个 Java socket客户端之间构建一个文件传输机制。 发送方客户端将包括以下代码段:


 FileInputStream fis = null;
 BufferedInputStream bis = null;
 BufferedOutputStream outStream = null;
 byte[] fileBytes = new byte[(int) file.length()];
 int bytesRead = 0;

 try {
 fis = new FileInputStream(file);
 bis = new BufferedInputStream(fis);
 outStream = new BufferedOutputStream(socket.getOutputStream());
 bytesRead = bis.read(fileBytes, 0, fileBytes.length);
 outStream.write(fileBytes, 0, fileBytes.length);

 } catch (IOException _IOExc) {
 Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, 
 null, _IOExc);
//QuitConnection(QUIT_TYPE_DEFAULT);
 } 

服务器中介看起来像:


public void run() {
 assert (outSocket!= null);
 byte[] bytes = new byte[fileSize];
 try {
 System.out.println("inStream" + inStream.available());
 outStream = new BufferedOutputStream(outSocket.getOutputStream());
 inStream.read(bytes, 0, fileSize);
 outStream.write(bytes, 0, fileSize);
 outStream.flush();

 } catch (IOException ex) {
 Logger.getLogger(FileTransport.class.getName()).log(Level.SEVERE, 
 null, ex);
 }
 }

目标客户端:


 public void run() {
 try {
 System.out.println("Start reading...");
 int len = 1024;
 BufferedInputStream inStream = new BufferedInputStream 
 (client.user.getClientSocket().getInputStream());
 while ((bytesRead = inStream.read(fileBytes, 0, len))> 
 0 && current <fileSize) {
 current = current + bytesRead;
 System.out.println("current"+ current);
 bos.write(fileBytes, 0, bytesRead <len? bytesRead : len);
 }
 bos.flush();
 bos.close();
 } catch (IOException ex) {
 Logger.getLogger(ReadFileThread.class.getName()).log(Level.SEVERE, 
 null, ex);
 } catch (InterruptedException e) {
 }
 }

在服务器端和目标客户端都通过"文件大小",现在的问题是服务器端的数据很少,服务器只能从服务器读取2 字节的数据,而且不能从服务器上取出循环。

非常感谢 Kev

时间: 原作者:

0 0

不要忽略 read() 方法的结果。 它返回已经读取的字节数,而不一定是文件的长度。 read() 必须始终在循环中调用,直到它返回 -1.

而且,永远不要使用 available() 。 它不返回你认为它返回的内容。 循环直到 read() 返回 -1或者直到读取字节数达到预期计数为止。

阅读的IO教程。

原作者:
...