首頁  >  文章  >  Java  >  如何在Java中正確透過Socket傳輸檔案?

如何在Java中正確透過Socket傳輸檔案?

Susan Sarandon
Susan Sarandon原創
2024-11-03 13:59:31270瀏覽

How to Correctly Transfer Files Over Sockets in Java?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn