温馨提示×

如何使用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. 文件名通常不包含路径信息,因为它是在客户端和服务器之间传输的。如果需要在不同的目录中保存文件,可以在服务器端代码中使用相对路径或绝对路径。
  3. 这个示例假设文件大小不会超过Integer.MAX_VALUE(即2^31 - 1字节)。如果文件可能非常大,你可能需要使用其他方法来传输文件,例如将文件分割成多个部分并分别传输。
  4. 这个示例没有实现断点续传功能。如果需要在传输大文件时支持断点续传,你需要在客户端和服务器端都添加额外的逻辑来处理这种情况。
  5. 为了简化示例,这个示例没有实现加密或身份验证功能。在实际应用中,你可能需要添加这些功能来保护数据的安全性。

0