多线程下文件的上传:
要想实现此需求,我们首先要掌握多线程的相关知识【线程的的实现方法】、以及用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 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、多线程】,这样才能理解每个步骤,代码的实现逻辑才会一目了然。