即时聊天系统
Java聊天系统-基于TCP/IP协议的在线通信
项目概述:
本系统基于TCP/IP协议进行构建,使用C/S架构进行组织,实现一个支持多人在线、两两聊天的桌面式应用程序
项目Github地址:https://github.com/YXCS-cya/Online-Chat
功能分析
- 用户登录及登录验证
- 用户能够使用固定帐号登录系统,系统能对预定的帐号、密码进行验证。
- 两两通信
- 要求服务器同时支持多个两两通信
- 好友管理:
- 能够显示好友列表,实现热更新
- 在线、离线状态显示
- 可传输多种聊天类型
- 聊天记录管理
- 通过服务器端文件方式进行同步
架构设计
该系统采用 经典 C/S 架构(Client/Server),由客户端程序与服务器程序共同协作完成消息传输、用户状态管理和聊天功能。为了实现高并发、多用户的实时通信,系统设计中体现了多线程、网络通信等多个关键点。
- C/S架构:
- 客户端 负责界面交互、消息发送、好友管理;
- 服务器 接收客户端请求,处理数据同步、聊天记录、用户状态等。
- 客户端与服务器之间通过 TCP Socket 建立稳定的双向连接,保证通信可靠性。
- 多线程:处理一个服务器,多个客户端
- 线程池+HashMap组织
- 每个客户端连接由一个线程
MyRunnable
进行服务,线程之间互不干扰,实现并发处理。 - 使用
HashMap<String, MyRunnable>
来维护每个在线用户的线程,方便推送在线列表和点对点通信。
- 数据流与文件传输:
- 采用 对象流(ObjectInputStream/ObjectOutputStream) 对消息进行封装和传输,支持包括文字、图片、文件等多种类型的消息。
- 所有消息统一封装为
Message
类对象,增强了传输的规范性与可扩展性。
- 观察者模式:实现好友在线列表设置
- 客户端启动时注册监听器,当服务器检测到好友上线或下线,便广播事件通知在线用户更新好友列表。
- 实现了与 UI 界面联动的“热更新”效果,提升用户体验。
- 消息通信协议设计(基于 TCP)
- 使用自定义的
MessageType
接口定义所有的通信类型(如聊天、好友请求、在线状态等),使得服务器端可以进行消息分发判断。
- 使用自定义的
- UI界面
- 利用面向对象方式将界面组件和逻辑封装,提升系统扩展性和可维护性。
技术栈总结
层次 | 技术栈/工具 | 描述 |
---|---|---|
通信协议 | TCP/IP + Socket | 实现客户端与服务器之间可靠的连接 |
并发处理 | Java 多线程、线程池 | 支持多用户同时在线与高并发处理 |
数据结构 | HashMap、List | 管理连接状态、在线列表、用户消息 |
对象传输 | Java Serializable、ObjectInputStream/ObjectOutputStream | 实现消息对象化、支持多类型内容传输 |
设计模式 | 观察者模式、单例模式 | 好友状态监听、线程统一管理 |
界面开发 | Java Swing & JavaFX | 实现图形化客户端界面 |
用户身份验证 | 用户ID+密码固定验证 | 账号权限管理 |
数据存储 | 文件系统(后续可扩展为数据库) | 聊天记录与离线消息管理 |
消息协议设计 | 自定义消息类型常量接口 MessageType |
消息分类,便于服务器调度处理 |
系统实现
总体概述
项目包括客户端模块、服务器模块、工具管理模块。
客户端(Client)
- 实现图形用户界面(GUI),负责用户交互。
- 职责模块化设计:登录、好友管理、消息发送与接收、聊天记录查看。
- UI 组件解耦,增加扩展性与可维护性。
用户好友列表示例:
服务器(Server)
- 通信层:基于 TCP/IP 的 Socket 长连接。
- 线程调度层:每个客户端连接由线程池调度一个工作线程(
MyRunnable
)。 - 消息分发层:统一封装传输消息结构,基于
MessageType
做消息类型分流。 - 状态管理层:使用
HashMap<String, MyRunnable>
存储客户端连接,实现在线状态管理等功能。
消息传输示例:
工具管理模块
- 客户端列表、Socket通道、线程统一使用
HashMap
容器维护。
工具管理模块软件包示例
服务器模块:
1. 网络通信
服务器模块是网络通信的核心,一切操作的核心都在于Socket的建立。如何建立稳定的Socket通道是这个模块的重点。为此,本系统采用了多线程,统一管理的方式进行处理。
public ServerConClient(/*String userId*/) throws IOException, ClassNotFoundException {
ServerSocket ss = new ServerSocket(10000);
while (true){
Socket socket = ss.accept();
InputStreamReader(socket.getInputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
try {
MyRunnable myRunnable = new MyRunnable(socket,ois);
myRunnable.start();
}catch (ClassCastException e){
e.printStackTrace();
- 多线程
服务器模块为了实现多对多聊天,为每一个连接上的客户端开启了一个线程。且为了保证传输通道的稳定性,尽量保证每个线程只使用统一封装好的Socket通道和输入输出流ois\oos.
/*
* 每个客户端登陆,服务器就会开一个线程MyRunnable
*/
public MyRunnable(Socket socket, ObjectInputStream ois){
this.socket = socket;
this.ois = ois;
- 对象流操作
为了保证传递的稳定性,本系统将所有客户端和服务器之间的信息传递定为统一的Message类,同时通过接口MessageType区分各个信息类型。
public class Message implements java.io.Serializable{
private String mesType;
private String Mes;
private String sender;
private String getter;
private String sendTime;
}
public interface MessageType {
String message_user = "1";
String message_recoder = "2";//聊天记录
String message_mes = "3";
String message_get_olFriend = "4";//请求在线好友
String message_ret_olFriend = "5";//返回在线好友
}
工具管理模块
通过Hashmap的容器管理:客户聊天界面、与服务器连接的客户端、服务器与客户端之间的Socket通道、好友列表。
本系统的大部分功能,如多线程、好友在线、多对多通信,都是由这个模块协助实现的。
>以服务器端维护在线客户端为例
public class ManageClient {
//单例模式,保证哈希容器唯一,避免用户信息丢失
public static HashMap hm = new HashMap<String, MyRunnable>();
public static void addClientThread(String uid, MyRunnable ct){ hm.put(uid,ct); }
public static MyRunnable getClientThread(String uid){
return (MyRunnable) hm.get(uid);
}
//获取在线成员
public static String getAllOnlineUser(){ }
从技术上看,这个模块全部利用了Hashmap容器,它提供的键值对、迭代器遍历、等功能操作简单,却及其高效地实现了对线程、对象、方法的管理。