From fcd7b9e1b48ed1abd1efcab9fdd1445944143b1a Mon Sep 17 00:00:00 2001 From: xuxin <840198532@qq.com> Date: Fri, 27 Mar 2026 11:09:57 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E9=98=B6day11-=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E7=BC=96=E7=A8=8B=5FTCP=E5=A4=9A=E7=BA=BF=E7=A8=8Blambda?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TcpUploadClientDemo08.java | 47 ++++++++++++ .../TcpUploadServerDemo08.java | 71 +++++++++++++++++++ .../TcpUploadClientDemo07.java | 2 +- 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 javaSE-day11/src/com/inmind/lambda_upload06/TcpUploadClientDemo08.java create mode 100644 javaSE-day11/src/com/inmind/lambda_upload06/TcpUploadServerDemo08.java diff --git a/javaSE-day11/src/com/inmind/lambda_upload06/TcpUploadClientDemo08.java b/javaSE-day11/src/com/inmind/lambda_upload06/TcpUploadClientDemo08.java new file mode 100644 index 0000000..63c71f1 --- /dev/null +++ b/javaSE-day11/src/com/inmind/lambda_upload06/TcpUploadClientDemo08.java @@ -0,0 +1,47 @@ +package com.inmind.lambda_upload06; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +/* +文件上传客户端的实现步骤: +1.创建字节输入流读取图片的字节数据 +2.创建客户端对象指定服务器的IP和端口 +3.获取客户端的字节输出流,将图片的字节数据边读边写,作为请求数据,发送给服务器 +4.获取客户端的字节输入流,接收服务器的响应数据 +5.资源释放 + */ +public class TcpUploadClientDemo08 { + public static void main(String[] args) throws IOException { + //1.创建字节输入流读取图片的字节数据 + FileInputStream fis = new FileInputStream("1.jpg"); + //2.创建客户端对象指定服务器的IP和端口 + Socket client = new Socket("192.168.22.51", 10002); + OutputStream os = client.getOutputStream();//发送请求数据 + byte[] buf = new byte[1024]; + int len; + + //3.获取客户端的字节输出流,将图片的字节数据边读边写,作为请求数据,发送给服务器 + while ((len = fis.read(buf)) != -1) { + os.write(buf,0,len); + } + //通知服务端,请求数据发送结束了 + fis.close(); + System.out.println("客户端上传了图片"); + client.shutdownOutput(); + //4.获取客户端的字节输入流,接收服务器的响应数据 + InputStream is = client.getInputStream(); + while ((len = is.read(buf)) != -1) { + System.out.println(new String(buf, 0, len)); + } + System.out.println("客户端接收到了响应的结果"); + //5.资源释放 + client.close(); + } + + + +} diff --git a/javaSE-day11/src/com/inmind/lambda_upload06/TcpUploadServerDemo08.java b/javaSE-day11/src/com/inmind/lambda_upload06/TcpUploadServerDemo08.java new file mode 100644 index 0000000..9d81155 --- /dev/null +++ b/javaSE-day11/src/com/inmind/lambda_upload06/TcpUploadServerDemo08.java @@ -0,0 +1,71 @@ +package com.inmind.lambda_upload06; + +import com.inmind.threads_upload05.UploadTask; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/* + 多线程上传服务器 + 多线程启动方式: + 1.继承Thread + 2.实现Runnable接口 + 3.线程池 + */ +public class TcpUploadServerDemo08 { + public static void main(String[] args) throws IOException { + //1.创建一个服务端对象,接收请求 + ServerSocket server = new ServerSocket(10002); + + //创建一个线程池对象 + ExecutorService executorService = Executors.newFixedThreadPool(5); + System.out.println("服务端启动了"); + while (true) { + final Socket clientSocket = server.accept(); + //创建线程,启动执行文件上传的任务 + //new Thread(new UploadTask(clientSocket)).start(); + //使用线程池,执行文件上传的任务 + executorService.execute(()->{ + try { + System.out.println(clientSocket.getInetAddress().getHostAddress()); + System.out.println(Thread.currentThread().getName()+"在执行文件上传任务"); + //2.获取客户端socket对象的字节输入流,接收请求数据(图片字节数据) + InputStream is = clientSocket.getInputStream(); + byte[] buf = new byte[1024]; + int len; + //3.创建字节输出流,边读边写到硬盘中 + //注意:在多线程中可能获取相同的毫秒值,导致不同文件的覆盖,这里推荐使用uuid + FileOutputStream fos = new FileOutputStream("D:\\io_test\\upload\\"+ UUID.randomUUID() +".jpg"); + while ((len = is.read(buf)) != -1) { + fos.write(buf,0,len); + } + fos.close(); + System.out.println("服务器保存了上传的图片"); + //4.获取客户端的socket对象字节输出流,发送响应数据(上传成功) + OutputStream os = clientSocket.getOutputStream(); + os.write("上传成功".getBytes()); + System.out.println("服务器响应了结果给客户端"); + + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + if (clientSocket != null) {//JDK7之前的IO异常处理方案 + //5.资源释放 + try { + clientSocket.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + }); + } + } +} diff --git a/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadClientDemo07.java b/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadClientDemo07.java index 11dbdf0..00460cd 100644 --- a/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadClientDemo07.java +++ b/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadClientDemo07.java @@ -17,7 +17,7 @@ import java.net.Socket; public class TcpUploadClientDemo07 { public static void main(String[] args) throws IOException { //1.创建字节输入流读取图片的字节数据 - FileInputStream fis = new FileInputStream("4.jpg"); + FileInputStream fis = new FileInputStream("1.jpg"); //2.创建客户端对象指定服务器的IP和端口 Socket client = new Socket("192.168.22.51", 10002); OutputStream os = client.getOutputStream();//发送请求数据