多线程下文件的上传:
要想实现此需求,我们首先要掌握多线程的相关知识【线程的的实现方法】、以及用IO流进行数据的传输和用TCP协议发送和接收数据。
模拟多线程下文件的上传的客户端
技术分析:客户端我们使用Socket类【套接字】提供的方法
【重点实现思路】
run方法:
1、创建套接字对象【Socket】---参数服务端的ip和port;
2、创建输入流对象--读取磁盘文件的数据到内存;
3、获取输出流对象--将内存中的数据写出【while边读边写】;
4、提示服务端数据传输完成;
5、等待接收服务器端返回的结果;
6、将结果打印到控制台;
7、关闭输入流和Socket;’
8、main方法中启动线程
main方法:
package com.tlc.text;/*** @auther 喵了个@汪* 客户端*/public class TCPImgSend {public static void main(String[] args) {//创建5个线程用来传输文件,并开启线程new ImgUpload("1.jpeg").start();new ImgUpload("2.jpeg").start();new ImgUpload("3.jpeg").start();new ImgUpload("4.jpeg").start();new ImgUpload("5.jpeg").start();}}
客户端--线程任务实现:
package com.tlc.text;/*** @auther * 线程任务--上传数据端*/import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .InetAddress;import .Socket;public class ImgUpload extends Thread {//属性--文件名private String imgName;public ImgUpload(String imgName) {this.imgName = imgName;}public String getImgName() {return imgName;}public void setImgName(String imgName) {this.imgName = imgName;}@Overridepublic void run() {//创建客户端套接字对象Socket socket = null;//创建输入流对象,获取磁盘的文件FileInputStream fis = null;try {socket = new Socket(InetAddress.getLocalHost(), 6666);fis = new FileInputStream("Item/mm/miao/" + imgName);//获取输出流传输数据OutputStream os = socket.getOutputStream();//while循环实现边读边写int len;while((len = fis.read()) != -1) {os.write(len);}//提示服务器传输完成socket.shutdownOutput();//接收服务器返回的结果InputStream is = socket.getInputStream();//创建字节数组byte[] bytes = new byte[1024];int len1 = is.read(bytes);//将服务器返回的结果打印到控制台System.out.println(new String(bytes, 0, len1));} catch (IOException e) {e.printStackTrace();}finally {if(fis != null) {//关闭io输入流try {fis.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null) {try {//关闭套接字socket.close();} catch (IOException e) {e.printStackTrace();}}}}}
模拟多线程下文件的上传的服务器端:
1、创建套接字对象【ServerSocket】---参数port;
2、使用while循环实现多文件上传的线程分配;
3、监测客户端的套接字对象;
4、获取输入流读取上传的文件;
5、输出流写入磁盘文件;
6、客户端上传完毕,提示上传成功
package com.tlc.text;/*** @auther 喵了个@汪* 接收数据的服务端*/import java.io.*;import .ServerSocket;import .Socket;import java.util.UUID;public class TCPImgReceive {public static void main(String[] args) {//创建套接字对象ServerSocket socket = null;try {socket = new ServerSocket(6666);} catch (IOException e) {e.printStackTrace();}//while循环实现多文件传输的线程分配while (true) {try {//检测客户端的套接字Socket detection = socket.accept();new Thread() {@Overridepublic void run() {//获取读取数据的输入流InputStream is = null;//获取写出磁盘的输出流FileOutputStream fos = null;try {is = detection.getInputStream();//读取传输过来的文件写入指定的位置fos = new FileOutputStream("Item/mm/" + UUID.randomUUID() + ".jpg");//边读边写进行数据的传输int len;while ((len = is.read()) != -1) {fos.write(len);}//数据传输完毕回复客户端OutputStream os = detection.getOutputStream();os.write("数据传输成功!".getBytes());} catch (IOException e) {e.printStackTrace();}}}.start();} catch (IOException e) {e.printStackTrace();}}}}
以上代码可以进行参考,但是如果想要完成以上案例,最好先掌握基本的知识点【TCP、多线程】,这样才能理解每个步骤,代码的实现逻辑才会一目了然。