主要是对服务端进行了升级:服务端开启子线程,一直处于可以接受不同客户端传来数据的状态
1客户端
package facepeople.tcppg;
import java.io.*;
import java.net.Socket;
/**
* 客户端程序, 实现文件上传
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
//1. 【客户端】输入流,从硬盘读取文件数据到程序中。
//1.1 创建输入流, 读取本地文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("b.jpg"));
//1.2 创建输出流, 写数据到服务器端
Socket socket = new Socket("localhost", 6667);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
//2. 【客户端】输出流,写出文件数据到服务端。
byte[] buffer = new byte[1024 * 8];
int len;
while( (len = bis.read(buffer)) != -1){
bos.write(buffer, 0 , len);
}
//关闭输出流, 通知服务器端, 写出数据完毕
socket.shutdownOutput();
System.out.println("文件发送完毕");
//6. 【客户端】获取输入流,解析回写数据。
InputStream in = socket.getInputStream();
byte[] back = new byte[1024];
int length = in.read(back);
System.out.println(new String(back, 0, length));
//释放资源
socket.close();
bis.close();
}
}
2服务端
package facepeople.tcppg;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 加入多线程技术
* 服务器端程序, 文件上传
*/
public class ServerDemo2 {
public static void main(String[] args) throws IOException {
//0.【服务端】 创建服务器端的ServerSocket对象, 等待客户端Socket的连接
System.out.println("服务器启动...");
ServerSocket serverSocket = new ServerSocket(6667);
while(true){
//等待客户端Socket的连接
Socket socket = serverSocket.accept();
//开启一个新的线程,与客户端进行互通
new Thread(new Runnable() {
@Override
public void run() {
try {
//1. 【服务端】输入流,读取文件数据到服务端程序。
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
//2. 【服务端】输出流,写出文件数据到服务器硬盘中。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("img/"+ System.currentTimeMillis() +".png"));
//读写数据
byte[] buffer = new byte[1024 * 8];
int len;
while( (len = bis.read(buffer)) != -1){
bos.write(buffer, 0 , len);
}
//3. 【服务端】获取输出流,回写数据。
System.out.println("会写数据给客户端...");
OutputStream out = socket.getOutputStream();
out.write("上传成功".getBytes());
out.close();
//4.释放资源
socket.close();
bos.close();
System.out.println("文件上传已保存");
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}