0

我使用插座的java文件传输。 这里是客户代码Java文件收到停止

for(int i = 0;i < fileList.size();i++) { 
    String filename = (String)fileList.get(i); 
    RequestFile(filename); 

    try { 
     BufferedOutputStream fileWriter = new BufferedOutputStream(
               new FileOutputStream(
                new File(PROGRAM_PATH + "/" + 
                  filename)));   
     int packet; 
     int count = 0; 

     while((packet = fileReader.read()) != -1) { 
      fileWriter.write(packet); 
      count++; 
     } 

     System.out.println(filename + " receiver complete. (count : " + count + ")"); 
     fileWriter.flush(); 
     fileWriter.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

这里是服务器代码

public void SendFile(String filename) { 
    try { 
     fileReader = new BufferedInputStream(new FileInputStream(CLIENT_PATH + "/" + filename)); 

     int packet; 
     int count = 0; 
     while((packet = fileReader.read()) != -1) { 
      count++; 
      fileWriter.write(packet); 
     } 
     fileWriter.write(-1); 
     System.out.println(count); 

     fileReader.close(); 
    } 
    catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

当我检查了服务器的数量,这是635。这意味着服务器已发送数据635次。 但是,客户的打印计数只有512。 (从0到511),我认为这是停在read(),因为

System.out.println(filename + " receiver complete. (count : " + count + ")"); 

不打印。有人能告诉我理由和解决方案吗?

+0

我想你应该使用'packet'来增加'count'并检查是否所有的字节都被传输了。 – Tirath 2014-10-27 12:10:11

回答

0

在服务器端,您无法向客户端发送值为-1的字节。此行:

fileWriter.write(-1); 

它没有做你想做的事。 write()方法将取参数的最低8位并将其作为一个字节发送(在这种情况下,将为0xff)。在客户端fileReader.read()将收到此为0xff(类型int)而不是-1(类型int)。

-1是一个特殊值,表示已达到流末尾。这不是一个有效的数据要写或读。如果您发送-1,客户端将读取它作为0xff=255。可以发送和接收的值是0..255(含)。再次,-1对于流结束是一个特殊值。

在服务器端,您不会刷新或关闭输出流。这可能会解释差异(缓冲区中的数据可能无法通过客户端)。