介绍
在这个项目中,你将学习如何使用 TCP 协议构建一个简单的图像上传应用程序。该应用程序由一个客户端和一个服务器组成,客户端可以将图像上传到服务器,服务器将接收并存储该图像。
👀 预览



🎯 任务
在这个项目中,你将学习:
- 如何设置服务器以监听客户端的传入连接并接收上传的图像
- 如何实现客户端读取本地图像文件并将其发送到服务器
- 如何使用 TCP 套接字处理客户端与服务器之间的通信
- 如何在图像上传成功后向客户端提供反馈
🏆 成果
完成这个项目后,你将能够:
- 使用 Java 创建服务器 - 客户端架构
- 使用 TCP 套接字在客户端和服务器之间进行文件传输
- 在 Java 中处理文件 I/O 操作
- 实现基本的错误处理和反馈机制
设置服务器
在这一步中,你将学习如何设置服务器以接收上传的图像。
在代码编辑器中打开
org/labex/service/UploadService.java文件。在
main()方法中,创建一个ServerSocket对象,用于监听端口10203上的客户端传入连接:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
try (ServerSocket server = new ServerSocket(10203)) {
// 持续接受客户端连接
while (true) {
// 服务器等待
// 如果有连接,则返回客户端的 Socket
Socket client = server.accept();
InetAddress clientAddress = client.getInetAddress();
// 从客户端接收上传的图像
// 输入流:读取客户端发送的图像文件流
// 输出流:写入本地图像
String name = "/home/labex/project/pic/mn.jpg";
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(name));
InputStream in = client.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);) {
// 从客户端读取图像文件流
// 写入本地文件
byte[] buffer = new byte[1024];
int length = -1;
while ((length = bis.read(buffer))!= -1) {
bos.write(buffer, 0, length);
}
// 向客户端输出消息
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(client.getOutputStream()))) {
writer.write("Reception Complete");
writer.newLine();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
服务器将持续接受客户端连接并接收上传的图像。接收到的图像将存储在
/home/labex/project/pic/mn.jpg文件中。接收到图像后,服务器将向客户端发送一条“接收完成”的消息。
实现客户端
在这一步中,你将学习如何实现客户端,以便将图像上传到服务器。
在代码编辑器中打开
org/labex/client/UploadClient.java文件。在
main()方法中,创建一个Socket对象,用于连接到服务器127.0.0.1:10203:
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
try (
// Socket:客户端通信组件
// 读取本地图像 => 通过输出流发送到服务器
// OutputStream:将本地图像文件流发送到服务器
// BufferedInputStream:读取本地图像
Socket client = new Socket("127.0.0.1", 10203);
OutputStream out = client.getOutputStream();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
"/home/labex/project/timg.jpg"))
) {
// 每次读取 1024 字节
byte[] buffer = new byte[1024];
int length = -1;
while ((length = in.read(buffer))!= -1) {
// 通过输出流将读取的内容发送到服务器
out.write(buffer, 0, length);
}
// 暂时结束“输出”(Socket 未关闭)
client.shutdownOutput();
// 读取服务器的反馈
try (BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()))) {
String reply = reader.readLine();
System.out.println(reply);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
客户端将读取本地图像文件
/home/labex/project/timg.jpg,并使用套接字的输出流将其发送到服务器。发送图像后,客户端将读取服务器的反馈消息并打印到控制台。
如果服务器发送“接收完成”消息,则表示图像上传成功。
现在,你已经完成了服务器和客户端的实现。你可以编译并运行程序来测试图像上传功能。
运行
打开一个终端并运行以下命令来编译你的客户端和服务器程序:
javac org/labex/client/UploadClient.java
javac org/labex/service/UploadService.java
启动服务器以监听客户端:
java org.labex.service.UploadService
打开另一个终端以启动客户端上传图像,你将得到提示:“接收完成”

java org.labex.client.UploadClient
检查 pic 文件夹中是否包含该图像:
ls pic
运行效果如下:

总结
恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。



