基于 TCP 协议的图像上传

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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

👀 预览

客户端上传图像界面
客户端上传图像界面
客户端与服务器之间的图像传输

🎯 任务

在这个项目中,你将学习:

  • 如何设置服务器以监听客户端的传入连接并接收上传的图像
  • 如何实现客户端读取本地图像文件并将其发送到服务器
  • 如何使用 TCP 套接字处理客户端与服务器之间的通信
  • 如何在图像上传成功后向客户端提供反馈

🏆 成果

完成这个项目后,你将能够:

  • 使用 Java 创建服务器 - 客户端架构
  • 使用 TCP 套接字在客户端和服务器之间进行文件传输
  • 在 Java 中处理文件 I/O 操作
  • 实现基本的错误处理和反馈机制

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) java/FileandIOManagementGroup -.-> java/files("Files") java/FileandIOManagementGroup -.-> java/io("IO") java/ConcurrentandNetworkProgrammingGroup -.-> java/net("Net") subgraph Lab Skills java/files -.-> lab-300368{{"基于 TCP 协议的图像上传"}} java/io -.-> lab-300368{{"基于 TCP 协议的图像上传"}} java/net -.-> lab-300368{{"基于 TCP 协议的图像上传"}} end

设置服务器

在这一步中,你将学习如何设置服务器以接收上传的图像。

  1. 在代码编辑器中打开 org/labex/service/UploadService.java 文件。

  2. 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();
        }
  1. 服务器将持续接受客户端连接并接收上传的图像。接收到的图像将存储在 /home/labex/project/pic/mn.jpg 文件中。

  2. 接收到图像后,服务器将向客户端发送一条 “接收完成” 的消息。

实现客户端

在这一步中,你将学习如何实现客户端,以便将图像上传到服务器。

  1. 在代码编辑器中打开 org/labex/client/UploadClient.java 文件。

  2. 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();
        }
  1. 客户端将读取本地图像文件 /home/labex/project/timg.jpg,并使用套接字的输出流将其发送到服务器。

  2. 发送图像后,客户端将读取服务器的反馈消息并打印到控制台。

  3. 如果服务器发送 “接收完成” 消息,则表示图像上传成功。

现在,你已经完成了服务器和客户端的实现。你可以编译并运行程序来测试图像上传功能。

运行

打开一个终端并运行以下命令来编译你的客户端和服务器程序:

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 中练习更多实验来提升你的技能。