Java 透過套接字傳輸檔案:傳送和接收位元組數組
在Java 中,透過套接字傳輸檔案涉及將檔案轉換為位元組數組,透過套接字發送它們,然後在接收端將位元組轉換回檔案。本文解決了 Java 開發人員在實作此文件傳輸功能時遇到的問題。
伺服器端問題
伺服器程式碼在接收時似乎創建了一個空檔案來自客戶端的資料。為了解決這個問題,伺服器應該使用循環來分塊讀取客戶端發送的數據,並使用緩衝區來暫時儲存數據。一旦接收到所有數據,伺服器就可以寫入完整的檔案。更正後的伺服器程式碼如下:
<code class="java">byte[] buffer = new byte[1024]; int bytesRead = 0; while ((bytesRead = in.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); }</code>
客戶端問題
客戶端程式碼最初會傳送一個空位元組數組給伺服器。要傳送實際的文件內容,應使用以下程式碼:
<code class="java">FileInputStream is = new FileInputStream(file); byte[] bytes = new byte[(int) length]; is.read(bytes); out.write(bytes);</code>
改進的程式碼
經過上述修正,伺服器和用戶端的完整程式碼為如下:
伺服器:
<code class="java">... byte[] buffer = new byte[1024]; DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); FileOutputStream fos = new FileOutputStream("C:\test2.xml"); int bytesRead = 0; while ((bytesRead = in.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); } fos.close(); ...</code>
客戶端:
<code class="java">... Socket socket = new Socket(host, 4444); DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); File file = new File("C:\test.xml"); FileInputStream is = new FileInputStream(file); long length = file.length(); if (length > Integer.MAX_VALUE) { System.out.println("File is too large."); } byte[] bytes = new byte[(int) length]; is.read(bytes); out.write(bytes); ...</code>
以上是如何在Java中正確透過Socket傳輸檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!