Java Socket 发送文件实现指南
在Java中使用Socket发送文件是一个常见的网络编程任务,下面我将提供一个完整的实现方案,包括服务端和客户端代码。

基本原理
- 服务端监听特定端口等待客户端连接
- 客户端连接到服务端
- 客户端读取本地文件并发送
- 服务端接收文件并保存到本地
完整实现代码
服务端代码 (FileServer.java)
import java.io.*;
import java.net.*;
public class FileServer {
public static void main(String[] args) {
int port = 12345;
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("服务器已启动,等待连接...");
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接: " + clientSocket.getInetAddress());
// 接收文件名
DataInputStream dis = new DataInputStream(clientSocket.getInputStream());
String fileName = dis.readUTF();
System.out.println("接收文件名: " + fileName);
// 接收文件大小
long fileSize = dis.readLong();
System.out.println("文件大小: " + fileSize + " bytes");
// 接收文件内容
FileOutputStream fos = new FileOutputStream("received_" + fileName);
byte[] buffer = new byte[4096];
int bytesRead;
long totalBytesRead = 0;
while (totalBytesRead < fileSize && (bytesRead = dis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
}
fos.close();
dis.close();
clientSocket.close();
System.out.println("文件接收完成: " + "received_" + fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码 (FileClient.java)
import java.io.*;
import java.net.*;
public class FileClient {
public static void main(String[] args) {
String serverAddress = "localhost";
int port = 12345;
String filePath = "example.txt"; // 要发送的文件路径
try (Socket socket = new Socket(serverAddress, port);
FileInputStream fis = new FileInputStream(filePath);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream())) {
// 发送文件名
File file = new File(filePath);
dos.writeUTF(file.getName());
// 发送文件大小
long fileSize = file.length();
dos.writeLong(fileSize);
// 发送文件内容
byte[] buffer = new byte[4096];
int bytesRead;
long totalBytesSent = 0;
while ((bytesRead = fis.read(buffer)) != -1) {
dos.write(buffer, 0, bytesRead);
totalBytesSent += bytesRead;
System.out.println("已发送: " + totalBytesSent + " / " + fileSize + " bytes");
}
fis.close();
dos.close();
System.out.println("文件发送完成");
} catch (IOException e) {
e.printStackTrace();
}
}
}
关键点说明
-
文件传输协议:
- 首先发送文件名(UTF字符串)
- 然后发送文件大小(long类型)
- 最后发送文件内容(字节流)
-
缓冲区处理:
- 使用4KB的缓冲区进行读写,提高效率
- 循环读取直到整个文件传输完成
-
进度显示:
客户端会显示已发送字节数/总字节数
(图片来源网络,侵删) -
资源管理:
使用try-with-resources确保所有流和socket正确关闭
增强功能建议
-
错误处理:
- 添加文件不存在、网络中断等异常处理
- 验证接收的文件大小是否与发送的一致
-
多文件传输:
- 可以扩展协议支持多文件传输
- 添加文件结束标记
-
加密传输:
- 使用SSL/TLS加密Socket通信
- 进行加密
-
进度回调:
添加进度监听接口,实时报告传输进度
-
断点续传:
记录已传输位置,支持从中断处继续传输
运行步骤
-
编译两个Java文件:
javac FileServer.java javac FileClient.java -
先启动服务端:
java FileServer -
在另一个终端启动客户端:
java FileClient -
服务端会收到文件并保存为"received_example.txt"
这个实现提供了基本的文件传输功能,可以根据实际需求进行扩展和优化。
