1

我正在用java文件传输线程客户端无法识别的文件流的末尾

这里是服务器的代码

(fileWriter = new BufferedOutputStream(fileTransferSocket.getOutputStream())) 

     try { 
      BufferedInputStream fileReader = new BufferedInputStream(new FileInputStream(CLIENT_PATH + "/" + filename)); 

      int packet; 

      while((packet = fileReader.read()) != -1) 
       fileWriter.write(packet); 

      fileWriter.flush(); 
      fileReader.close(); 

      System.out.println(filename + " send complete"); 
     } 

而且客户端的代码

(fileReader = new BufferedInputStream(fileTransferSocket.getInputStream())) 

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

       int packet; 

       while((packet = fileReader.read()) != -1) 
        fileWriter.write(packet); 

       System.out.println(filename + " receive complete."); 
       fileWriter.close(); 
      } 

服务器打印

System.out.println(filename + " send complete"); 

它表示服务器发送文件的每个字节。

但是,客户端不能打印

System.out.println(filename + " receive complete."); 

我检查了多少次,而循环运行(经过两个,服务器和客户端)

两个while循环运行685倍

我想客户端的while循环无法识别文件传输的结束。

任何人都知道问题?

回答

-1

您可以测试打印-1在您的服务,告诉变换的末尾:

while((packet = fileReader.read()) != -1) 
      fileWriter.write(packet); 
fileWriter.write(-1); 
+0

它没有工作......我无法逃避while循环。 – 2014-10-28 01:40:16

+1

这是不对的。发送-1只是发送字节值“0xFF”。 -1通过输入流'read'方法特别返回,它不是流本身的一部分。 – Radiodef 2014-10-28 01:55:29

+0

似乎在基本输入或输出流中的字节是从0-255,所以在数据转换级别,你不能告诉客户端是结束。否则你关闭套接字或使用应用程序逻辑数据替换结束,不仅-1在客户端。它可能是一些特殊字符。 – 2014-10-28 02:01:19

1

要发送EOF插座上,靠近fileWriter在服务器上。

while((packet = fileReader.read()) != -1) 
    fileWriter.write(packet); 

fileWriter.close(); // note 
fileReader.close();