前言
在学TCP的时候就做了一个多用户登录并得到响应的一个小项目,这个聊天室也是基于TCP通信原理的交互,在服务端对接收的Socket对象封装成线程类,开启多线程实现多用户同时接发数据。
不同的点是:
客户端
对接收和发送的代码进行了封装,封装成独立出来的两个线程类,就可以实现读写分离,不再是请求响应式的交流。
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("------client------");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名");
String name = br.readLine();
//建立连接:socket创建客户端
Socket client = new Socket("localhost",8888);
//客户端发送信息
new Thread(new ClientSend(client,name)).start(); //导入发送线程类
//获取消息
new Thread(new ClientReceive(client)).start(); //导入接收线程类
}
}
上面导入name变量之后在创建线程体时会先把name导入,这样在服务端就可以接收到这个线程对象的name属性,方便后面群发消息可以调用说话的客户端的名字。
下面就是客户端的接收和发送的两个线程类。
接收:
public class ClientReceive implements Runnable {
DataInputStream dis ;
Socket client;
boolean isRunning = true;
public ClientReceive(Socket client){
this.client = client;
try {
dis = new DataInputStream(client.getInputStream());
} catch (IOException e) {
release();
}
}
public void run() {
while(isRunning) {
//接收消息
String datas;
try {
datas = dis.readUTF();
System.out.println(datas);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//释放资源
private void release() {
this.isRunning = false;
try {
dis.close();
client.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
发送类:
public class ClientSend implements Runnable {
BufferedReader console;
DataOutputStream dos;
Socket client;
boolean isRunning = true;
String name;
public