Java控制台聊天室通过多线程实现:每个用户独立线程负责输入监听、消息收发;服务端用CopyOnWriteArrayList和ConcurrentLinkedQueue保障线程安全;消息采用文本协议如[user] msg;支持JOIN/QUIT指令与ANSI着色;退出时volatile标志+interrupt优雅终止。
用Java写一个控制台版聊天室,核心是让多个用户(线程)能同时收发消息,共享同一套聊天记录和在线用户列表。关键不在于界面多炫,而在于线程安全、通信逻辑清晰、资源不冲突。
模拟多个用户登录,就为每个用户启动一个独立线程(比如用Thread或ExecutorService)。该线程负责:监听本用户的键盘输入、把消息发给服务器、接收并打印其他人的消息。注意别让所有线程共用同一个Scanner实例,否则输入会互相抢占。
服务端用一个单独线程(或主线程)运行,维护两个关键共享资源:在线用户列表、聊天历史。这两者会被多个客户端线程并发读写,必须保证线程安全。
ions.synchronizedList(new ArrayList())
不用复杂序列化,用纯文本约定即可。例如:[userA] Hello world! 或 JOIN:userB、QUIT:userC。客户端线程解析前缀判断是普通消息、上线通知还是下线提示。
用户输入/exit或/quit时,不仅要从用户列表中移除自己,还要中断对应线程的监听循环,并关闭其相关流(如有)。主线程检测到所有客户端退出后,再优雅关闭服务端。