进阶day11-网络编程_TCP多线程lambda方式文件上传的实现

This commit is contained in:
2026-03-27 11:09:57 +08:00
parent 580ccafb2a
commit fcd7b9e1b4
3 changed files with 119 additions and 1 deletions

View File

@@ -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();
}
}

View File

@@ -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);
}
}
}
});
}
}
}

View File

@@ -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();//发送请求数据