溫馨提示×

如何使用Java Socket進行文件傳輸

小樊
81
2024-10-16 18:27:19
欄目: 編程語言

使用Java Socket進行文件傳輸主要涉及到兩個類:SocketObjectInputStream。以下是一個簡單的示例,演示了如何使用Java Socket在客戶端和服務器之間傳輸文件。

服務器端代碼

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        int port = 12345;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server is listening on port " + port);

        Socket socket = serverSocket.accept();
        System.out.println("Client connected");

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        File file = (File) ois.readObject();
        System.out.println("Received file: " + file.getName());

        // Save the file to the server's local directory
        File outputFile = new File("received_" + file.getName());
        FileOutputStream fos = new FileOutputStream(outputFile);
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = ois.read(buffer)) != -1) {
            fos.write(buffer, 0, bytesRead);
        }
        fos.close();
        ois.close();
        socket.close();
        serverSocket.close();
    }
}

客戶端代碼

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        String serverAddress = "localhost";
        int port = 12345;

        Socket socket = new Socket(serverAddress, port);
        System.out.println("Connected to server");

        // Create a file to send
        File file = new File("example.txt");
        FileInputStream fis = new FileInputStream(file);

        // Send the file name and length to the server
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        oos.writeObject(file.getName());
        oos.writeInt(file.length());

        // Send the file data to the server
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            oos.write(buffer, 0, bytesRead);
        }
        oos.close();
        fis.close();
        socket.close();
    }
}

注意事項:

  1. 在實際應用中,你可能需要添加更多的錯誤處理和異常管理。
  2. 文件名通常不包含路徑信息,因為它是在客戶端和服務器之間傳輸?shù)摹H绻枰诓煌哪夸浿斜4嫖募?,可以在服務器端代碼中使用相對路徑或絕對路徑。
  3. 這個示例假設文件大小不會超過Integer.MAX_VALUE(即2^31 - 1字節(jié))。如果文件可能非常大,你可能需要使用其他方法來傳輸文件,例如將文件分割成多個部分并分別傳輸。
  4. 這個示例沒有實現(xiàn)斷點續(xù)傳功能。如果需要在傳輸大文件時支持斷點續(xù)傳,你需要在客戶端和服務器端都添加額外的邏輯來處理這種情況。
  5. 為了簡化示例,這個示例沒有實現(xiàn)加密或身份驗證功能。在實際應用中,你可能需要添加這些功能來保護數(shù)據(jù)的安全性。

0