基于连接通信Socket、多线程的Java聊天室
1、开发环境:
IDEA2018.1+JDK1.8
2、实现功能:
实现了模拟登录注册、群聊、私聊、显示当前在线人数列表;
在发送信息时,会向对方发送者及显示发送时间;
显示在线人数列表时,也会显示查询时间;
实现了多线程发送消息、接收消息过程。
3、代码解析(源码可见本篇博客最后):
1)客户端源码解析
客户端使用两个线程操作
一个读线程:创建客户端输入流,while循环将读到的信息输出道控制台,模拟一直等待监听输入的情况;
一个写线程:创建客户端输出流,while循环获取用户从控制台输入的内容,若用户输入的信息中包含"bye",则关闭流并且关闭该用户的Socket,此时退出while循环,写线程结束;此时读线程的if条件判断就会执行break;while循环停止,读线程结束。
2)服务器源码解析
利用Executors类创建固定大小为20的线程池(实现多线程);
使用Map集合来存储用户信息,<String, Socket>:用户名,客户端的socket;Map集合使用子类ConcurrentHashMap来实例化,保证线程安全(主要可见Java集合总结);
使用内部类来处理客户端的连接与发送信息;
根据控制台约束信息进行用户注册、私发、群聊等等功能的实现
3)两台计算机之间使用套接字建立TCP连接过程:
服务器实例化一个ServerSocket对象,new ServerSocket(6666):表示是通过服务器上的6666端口进行通信;
服务器调用ServerSocket类的accept(),该方法阻塞式等待客户端的连接;
客户端实例化一个Socket对象,new Socket("127.0.0.1", 6666):指定服务器名称和端口号来请求连接,该构造方法试图将客户端连接到指定的服务器和端口号,如果通信建立,则会在客户端创建Socket对象能够与服务器进行通信;
在服务端,accept()方法返回客户端的socket对象。
4、结果展示:
开启了三个客户端
测试: 用户上线功能、显示当前用户列表功能、私聊功能、用户下线功能
测试: 用户上线功能、显示当前用户列表功能、群聊功能
测试: 用户上线功能、显示当前用户列表功能、群发功能、私聊功能
服务端:体现出了用户上线及用户下线的情况
客户端源代码:
//读线程
class ReadThread implements Runnable{
private Socket client;
public ReadThread(Socket client) {
this.client = client;
}
@Override
public void run() {