多线程下文件的上传:  

        要想实现此需求,我们首先要掌握多线程的相关知识【线程的的实现方法】、以及用IO流进行数据的传输和用TCP协议发送和接收数据。

多线程上传多文件java 多线程上传下载_socket

模拟多线程下文件的上传的客户端

技术分析:客户端我们使用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 java.net.InetAddress;
import java.net.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;
 }

 @Override
 public 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 java.net.ServerSocket;
import java.net.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() {
                 @Override
                 public 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、多线程】,这样才能理解每个步骤,代码的实现逻辑才会一目了然。