diff --git a/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadClientDemo07.java b/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadClientDemo07.java new file mode 100644 index 0000000..11dbdf0 --- /dev/null +++ b/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadClientDemo07.java @@ -0,0 +1,47 @@ +package com.inmind.threads_upload05; + +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 TcpUploadClientDemo07 { + public static void main(String[] args) throws IOException { + //1.创建字节输入流读取图片的字节数据 + FileInputStream fis = new FileInputStream("4.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/threads_upload05/TcpUploadServerDemo07.java b/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadServerDemo07.java new file mode 100644 index 0000000..9454c4f --- /dev/null +++ b/javaSE-day11/src/com/inmind/threads_upload05/TcpUploadServerDemo07.java @@ -0,0 +1,35 @@ +package com.inmind.threads_upload05; + +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.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/* + 多线程上传服务器 + 多线程启动方式: + 1.继承Thread + 2.实现Runnable接口 + 3.线程池 + */ +public class TcpUploadServerDemo07 { + public static void main(String[] args) throws IOException { + //1.创建一个服务端对象,接收请求 + ServerSocket server = new ServerSocket(10002); + + //创建一个线程池对象 + ExecutorService executorService = Executors.newFixedThreadPool(5); + System.out.println("服务端启动了"); + while (true) { + Socket clientSocket = server.accept(); + //创建线程,启动执行文件上传的任务 + //new Thread(new UploadTask(clientSocket)).start(); + //使用线程池,执行文件上传的任务 + executorService.execute(new UploadTask(clientSocket)); + } + } +} diff --git a/javaSE-day11/src/com/inmind/threads_upload05/UploadTask.java b/javaSE-day11/src/com/inmind/threads_upload05/UploadTask.java new file mode 100644 index 0000000..c6c0b6f --- /dev/null +++ b/javaSE-day11/src/com/inmind/threads_upload05/UploadTask.java @@ -0,0 +1,55 @@ +package com.inmind.threads_upload05; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.util.UUID; + +//当前类的作用:接收到一个请求就做一个文件上传的操作 +public class UploadTask implements Runnable{ + + private Socket clientSocket; + + public UploadTask(Socket clientSocket) { + this.clientSocket = clientSocket; + } + + @Override + public void run(){ + try { + System.out.println(clientSocket.getInetAddress().getHostAddress()); + + //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); + } + clientSocket = null; + } + } + } +}