如何使用Java Socket进行文件传输

avatar
作者
筋斗云
阅读量:0

使用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. 为了简化示例,这个示例没有实现加密或身份验证功能。在实际应用中,你可能需要添加这些功能来保护数据的安全性。