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對於流結束是一個特殊值。

在服務器端,您不會刷新或關閉輸出流。這可能會解釋差異(緩衝區中的數據可能無法通過客戶端)。