2015-10-25 104 views
2

我的文件從服務器傳輸到客戶端時出現問題。問題是,即使文件有多大,最後的字節也不會被傳輸。假設我想下載一個56kb的文件,那麼我只收到35kb的例子。Java套接字文件傳輸 - 未完成文件

我會爲您提供一些代碼片段,也許有人可以看到任何錯誤。

發件人:

public void sendFile(String fileName, Socket socket) { 
    try { 
     try { 
      File transferFile = new File(fileName); 
      byte[] bytearray = new byte[(int) transferFile.length()]; 
      FileInputStream fin = new FileInputStream(transferFile); 
      BufferedInputStream bin = new BufferedInputStream(fin); 
      OutputStream os = socket.getOutputStream(); 
      int bytesRead = 0; 

      while (-1 != (bytesRead = bin.read(bytearray, 0, bytearray.length))) { 
       os.write(bytearray, 0, bytesRead); 
      } 

      bin.close(); 
      os.flush(); 
      socket.close(); 
     } catch (IOException e) { 
      System.out.println("error " + e); 
     } 
    } catch (Exception ex) { 
     System.out.println("error " + ex); 
    } 
} 

接收機:

public void downloadFile(Socket socket, String fName) { 

    try { 
     InputStream is = socket.getInputStream(); 

     FileOutputStream fos = new FileOutputStream(fName); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 

     int count; 
     byte[] buffer = new byte[1024]; 

     while ((count = is.read(buffer)) != -1) { 
      bos.write(buffer, 0, count); 
     } 

     bos.flush(); 
     bos.close(); 
    } catch (Exception e) { 
     System.out.println("Error " + e); 
    } 
} 

歡迎任何幫助,謝謝。

+0

看看這篇文章和鏈接在該帖子中:http://stackoverflow.com/questions/32251895/java-file-transfer-file-to-server/32252321#32252321&http://www.coderanch .com/t/556838/java/java/Transferring-file-file-data-socket –

+0

在發件人處使用固定長度的緩衝區。沒有必要將它與文件長度聯繫起來。 1025與您的接收代碼相當,儘管較大不會造成傷害。 – EJP

回答

0

while ((count = is.read(buffer)) > 0)將打破循環如果is.read()返回零。

但是,如果返回零,則不應假定已達到文件末尾,因爲根據文檔,零是一個完全有效的返回值。

您應該繼續閱讀,直到返回-1

此外,在關閉您的BufferedOutputStream bos後,您還應該關閉您的FileOutputStream fos

+0

啊我明白了,這很有趣。它並沒有解決我的問題,雖然.. – user3618056

+0

所以,你不斷收到一個不完整的文件?你想用你的新代碼修改你的問題嗎? –

+0

當然,它現在在那裏! – user3618056