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();