即时聊天系统

Java聊天系统-基于TCP/IP协议的在线通信

项目概述:

本系统基于TCP/IP协议进行构建,使用C/S架构进行组织,实现一个支持多人在线、两两聊天的桌面式应用程序

项目Github地址:https://github.com/YXCS-cya/Online-Chat

功能分析

  1. 用户登录及登录验证
    • 用户能够使用固定帐号登录系统,系统能对预定的帐号、密码进行验证。
  2. 两两通信
    • 要求服务器同时支持多个两两通信
  3. 好友管理:
    • 能够显示好友列表,实现热更新
    • 在线、离线状态显示
  4. 可传输多种聊天类型
  5. 聊天记录管理
    • 通过服务器端文件方式进行同步

架构设计

该系统采用 经典 C/S 架构(Client/Server),由客户端程序与服务器程序共同协作完成消息传输、用户状态管理和聊天功能。为了实现高并发、多用户的实时通信,系统设计中体现了多线程、网络通信等多个关键点。

  1. C/S架构:
    1. 客户端 负责界面交互、消息发送、好友管理;
    2. 服务器 接收客户端请求,处理数据同步、聊天记录、用户状态等。
    3. 客户端与服务器之间通过 TCP Socket 建立稳定的双向连接,保证通信可靠性。
  2. 多线程:处理一个服务器,多个客户端
    1. 线程池+HashMap组织
    2. 每个客户端连接由一个线程 MyRunnable 进行服务,线程之间互不干扰,实现并发处理。
    3. 使用 HashMap<String, MyRunnable> 来维护每个在线用户的线程,方便推送在线列表和点对点通信。
  3. 数据流与文件传输:
    1. 采用 对象流(ObjectInputStream/ObjectOutputStream) 对消息进行封装和传输,支持包括文字、图片、文件等多种类型的消息。
    2. 所有消息统一封装为 Message 类对象,增强了传输的规范性与可扩展性。
  4. 观察者模式:实现好友在线列表设置
    1. 客户端启动时注册监听器,当服务器检测到好友上线或下线,便广播事件通知在线用户更新好友列表。
    2. 实现了与 UI 界面联动的“热更新”效果,提升用户体验。
  5. 消息通信协议设计(基于 TCP)
    1. 使用自定义的 MessageType 接口定义所有的通信类型(如聊天、好友请求、在线状态等),使得服务器端可以进行消息分发判断。
  6. UI界面
    1. 利用面向对象方式将界面组件和逻辑封装,提升系统扩展性和可维护性。

技术栈总结

层次 技术栈/工具 描述
通信协议 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();
  1. 多线程
    服务器模块为了实现多对多聊天,为每一个连接上的客户端开启了一个线程。且为了保证传输通道的稳定性,尽量保证每个线程只使用统一封装好的Socket通道和输入输出流ois\oos.
/*
* 每个客户端登陆,服务器就会开一个线程MyRunnable
*/
public MyRunnable(Socket socket, ObjectInputStream ois){  
this.socket = socket;  
this.ois = ois;
  1. 对象流操作
    为了保证传递的稳定性,本系统将所有客户端和服务器之间的信息传递定为统一的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容器,它提供的键值对、迭代器遍历、等功能操作简单,却及其高效地实现了对线程、对象、方法的管理。

posted @ 2025-05-15 19:54  云下成伞  阅读(28)  评论(0)    收藏  举报