TCP协议多线程处理多客户端请求
通过序列化以及反序列化实现对象的传递,利用Thread实现多线程处理多个客户端的请求
Server
public class TcpServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
try {
//创建端口
serverSocket = new ServerSocket(6668);
while(true){
System.out.println("等待客户端发送请求");
socket = serverSocket.accept();
//传参使得线程类获得socket的值
LoginThread thread = new LoginThread(socket);
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
assert serverSocket != null;
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Client
public class TcpClient {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Socket socket = null;
OutputStream outputStream = null;
ObjectOutputStream objectOutputStream = null;
InputStream inputStream =null;
try {
//创建客户端 IP+端口
socket = new Socket("127.0.0.1",6668);
outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
System.out.println("请输入账号");
String name = scanner.next();
System.out.println("请输入密码");
String psw = scanner.next();
User user = new User(name,psw);
//序列化
objectOutputStream.writeObject(user);
byte[] bytes = new byte[1024];
inputStream = socket.getInputStream();
int read = inputStream.read(bytes);
String back = new String(bytes,0,read);
System.out.println("服务端返回的数据为"+back);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
outputStream.flush();
objectOutputStream.flush();
inputStream.close();
objectOutputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
线程
public class LoginThread extends Thread{
//利用私有类得到socket的值
private Socket socket;
public LoginThread(Socket soket) {
this.socket = soket;
}
@Override
public void run() {
InputStream inputStream = null;
ObjectInputStream objectInputStream = null;
OutputStream outputStream = null;
String back = "";
try {
inputStream = socket.getInputStream();
//反序列化
objectInputStream = new ObjectInputStream(inputStream);
User user = (User) objectInputStream.readObject();
if (user.getName().equals("user") && user.getPsw().equals("1")){
back = "登录成功";
}else back ="登录失败";
outputStream = socket.getOutputStream();
outputStream.write(back.getBytes(StandardCharsets.UTF_8));
System.out.println("服务端返回数据成功");
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}finally {
try {
outputStream.flush();
outputStream.close();
objectInputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}