如何使用 Socket 编程实现文件传输?代码举例讲解

使用Socket编程实现文件传输主要分为以下步骤:

  1. 服务端监听指定端口,等待客户端连接。
  2. 客户端连接服务端,发送要传输的文件的名称和大小。
  3. 服务端接收文件名和大小信息,准备接收文件数据。
  4. 客户端读取文件内容,分批发送给服务端。
  5. 服务端接收文件数据,写入到本地文件中。
  6. 客户端发送文件传输结束标识。服务端接收到结束标识,文件传输完成。
  7. 服务端回复客户端传输成功信息。客户端接收成功信息,断开连接。

代码示例:

// 服务端
ServerSocket server = new ServerSocket(8000);
Socket socket = server.accept();

// 接收文件名和大小
byte[] buffer = new byte[64];  
int len = socket.getInputStream().read(buffer);
String filename = new String(buffer, 0, len);
len = socket.getInputStream().read(buffer); 
int filesize = Integer.parseInt(new String(buffer, 0, len));

// 创建文件并接收文件数据  
File file = new File(filename);
file.createNewFile();
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
int total = 0;
while (total < filesize) {
    int count = in.read(buffer);
    total += count;
    out.write(buffer, 0, count);
}
out.close();

// 回复客户端成功信息
socket.getOutputStream().write("SUCCESS".getBytes()); 
socket.close();
// 客户端
Socket socket = new Socket("127.0.0.1", 8000);

// 发送文件名和大小
String filename = "test.txt";
File file = new File(filename);
int filesize = (int) file.length();
socket.getOutputStream().write(filename.getBytes());
socket.getOutputStream().write(String.valueOf(filesize).getBytes());

// 读取文件并发送文件数据
DataInputStream in = new DataInputStream(new FileInputStream(file)); 
byte[] buffer = new byte[1024];
int total = 0;
while (total < filesize) {
    int count = in.read(buffer);
    total += count;
    socket.getOutputStream().write(buffer, 0, count);
}
in.close();  

// 接收成功信息并断开连接
byte[] buffer = new byte[10];
int len = socket.getInputStream().read(buffer);
String msg = new String(buffer, 0, len);
if ("SUCCESS".equals(msg)) {
    socket.close();
}