• ​​单线程上传​​
  • ​​服务端:​​
  • ​​客户端:​​
  • ​​多线程上传​​
  • ​​修改服务端:​​
  • ​​修改客户端​​

单线程上传

服务端:

public static void main(String[] args) {
try ( // 创建一个ServerSocket监听8080端口的客户端请求
ServerSocket server = new ServerSocket(8000);
// 使用accept()阻塞当前线程,等待客户端请求
Socket socket = server.accept();
// 由Socket获得输入流,并创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 由文件输出流创建缓冲输出流
FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\Pictures\\m66.png")) {
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次从Socket读取数据
int len = in.read(buffer);
while (len != -1) {
// 写入数据到文件
out.write(buffer, 0, len);
// 再次从Socket读取数据
len = in.read(buffer);
}System.out.println("接收完成!");
} catch (IOException e) {
e.printStackTrace();
}
}

客户端:

/**
* @Author he
* @Description 测试Socket上传文件的客户端
* @Date 8.22


**/
public class UdpClient {
public static void main(String[] args) {
try ( // 向本机的8080端口发出请求
Socket socket = new Socket("127.0.0.1", 8000);
// 由Socket获得输出流,并创建缓冲输出流
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
// 创建文件输入流
FileInputStream fin = new FileInputStream("C:\\Users\\14172\\Pictures\\m11.png");
// 由文件输入流创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(fin)) {
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次读取文件
int len = in.read(buffer);
while (len != -1) {
// 数据写入Socket
out.write(buffer, 0, len);
// 再次读取文件
len = in.read(buffer);
}
System.out.println("上传成功!");
} catch (
ConnectException e) {
System.out.println("服务器未启动!");
} catch (IOException e) {
e.printStackTrace();
}
}


}

查看文件:

【java网络编程】用TCP socket实现多线程图片上传_多线程


可以看到自己的目录下已经出现了C:\Users\14172\Pictures\m66.png

多线程上传

改成多线程的形式:

修改服务端:

public class isStream {

public static void main(String[] args)throws Exception {

ServerSocket server = new ServerSocket(8000);// 创建一个ServerSocket监听8080端口的客户端请求
// 使用accept()阻塞当前线程,等待客户端请求

while (true) //(2)开始在这里暂停等待接收客户端的连接,得到一个端到端的Socket管道
{
Socket socket = server.accept();
new ServerReadThread(socket).start();
}
}

class ServerReadThread extends Thread {
static int number = 0;

private Socket socket;

public ServerReadThread(Socket socket) {
this.socket = socket;
}
@Override
public void run(){
try(
// 由Socket获得输入流,并创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 由文件输出流创建缓冲输出流
FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\socket\\"+number+".png"))
{
number++;
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次从Socket读取数据
int len = in.read(buffer);
while (len != -1) {
// 写入数据到文件
out.write(buffer, 0, len);
// 再次从Socket读取数据
len = in.read(buffer);
System.out.println("接收完成!");
}
} catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
} catch (IOException ioException) {
ioException.printStackTrace();
}

}
}

查看结果:

【java网络编程】用TCP socket实现多线程图片上传_客户端_02

修改客户端

修改为用户输入图片路径,进行多次上传图片:

public class UdpClient {
public static void main(String[] args) throws IOException {
int num = 0;
Socket socket = new Socket("127.0.0.1", 8000);
// 由Socket获得输出流,并创建缓冲输出流
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
Scanner scanner = new Scanner(System.in);
// 创建文件输入流
while (true) {
num++;
try ( // 向本机的8080端口发出请求

//System.out.println("输入文件路径:");

FileInputStream fin = new FileInputStream(scanner.nextLine());
// 由文件输入流创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(fin)) {
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次读取文件
int len = in.read(buffer);
while (len != -1) {
// 数据写入Socket
out.write(buffer, 0, len);
// 再次读取文件
len = in.read(buffer);
}
System.out.println("上传成功!");
} catch (ConnectException e) {
System.out.println("服务器未启动!");
} catch (IOException e) {
e.printStackTrace();
}
if(num == 5) break;
}

}


}

【java网络编程】用TCP socket实现多线程图片上传_客户端_03


查看目录:

【java网络编程】用TCP socket实现多线程图片上传_输入流_04


发现一个小问题:已经存在的一样的命名的图片不会覆盖

然后有的图片传过去之后格式会损坏,貌似是jpg转为png命名的时候