该文章参考于: 点击链接

功能概述

服务器端

  • 监听连接: 服务器在指定端口(6666)上监听客户端的连接请求。
  • 多客户端支持: 每当有新的客户端连接,服务器会创建一个新的线程来处理该客户端的通信,从而支持多个客户端同时在线。
  • 用户管理: 服务器维护一个在线用户列表。当用户登录或退出时,服务器会更新列表并通知所有客户端。
  • 消息处理:
    • 登录: 处理客户端的登录请求,记录用户昵称。
    • 群聊: 接收客户端发送的群聊消息,并将其转发给所有在线用户。
    • 私聊: (暂未实现)。
  • 异常处理: 当客户端断开连接时,服务器会将其从在线用户列表中移除,并更新所有客户端的在线列表。

客户端

  • 图形用户界面: 使用 Java Swing 构建了用户友好的图形界面。
  • 登录: 提供一个登录窗口,用户可以输入昵称进入聊天室。
  • 聊天主界面:
    • 显示聊天消息记录。
    • 显示当前在线用户列表。
    • 提供消息输入框和发送按钮。
  • 多线程: 客户端使用一个独立的线程来接收来自服务器的消息,避免界面阻塞。
  • 消息收发:
    • 可以发送群聊消息。
    • 可以接收并显示群聊消息和在线用户列表更新。

核心类介绍

服务器端

  • server.Server: 服务器主类,负责启动服务器,监听客户端连接,并为每个客户端创建ServerReaderThread
  • server.ServerReaderThread: 核心线程类,负责与单个客户端进行通信,读取并处理来自客户端的各种请求(登录、群聊等)。

客户端

  • ui.App: 客户端应用的入口,启动登录窗口。
  • ui.ChatEntryFrame: 登录窗口,负责获取用户昵称并与服务器建立连接。
  • ui.ClientChatFrame: 聊天主窗口,负责展示聊天内容、在线用户列表,并提供用户交互界面。
  • ui.ClientReaderThread: 客户端的核心线程类,负责从服务器读取消息并更新ClientChatFrame的界面。

项目结构

src/main/java/
├───server/
│   ├───Constant.java
│   ├───Server.java
│   └───ServerReaderThread.java
└───ui/
    ├───App.java
    ├───ChatEntryFrame.java
    ├───ClientChatFrame.java
    ├───ClientReaderThread.java
    └───Constant.java
graph TD
    subgraph "客户端 (Client)"
        A[ui.App] --> B[ui.ChatEntryFrame 登录窗口];
        B -- "1.输入昵称, 连接服务器" --> E;
        B --> C[ui.ClientChatFrame 聊天窗口];
        C -- "2.启动监听线程" --> D[ui.ClientReaderThread 接收线程];
        C -- "5.用户发送消息" --> F;
        D -- "7.更新UI(聊天内容/用户列表)" --> C;
    end

    subgraph "服务器 (Server)"
        E[server.Server 主线程] -- "3.接受连接, 创建处理线程" --> F[server.ServerReaderThread 处理线程];
        F -- "4.处理消息(登录/群聊)" --> F;
        F -- "6.广播消息给所有客户端" --> D;
    end

    style E fill:#f9f,stroke:#333,stroke-width:2px
    style F fill:#f9f,stroke:#333,stroke-width:2px
    style A fill:#9cf,stroke:#333,stroke-width:2px
    style B fill:#9cf,stroke:#333,stroke-width:2px
    style C fill:#9cf,stroke:#333,stroke-width:2px
    style D fill:#9cf,stroke:#333,stroke-width:2px

这个图表描述了以下工作流程:

  1. 启动与登录:

    • 用户启动客户端 (ui.App),打开登录窗口 (ui.ChatEntryFrame)。
    • 用户输入昵称后,客户端向服务器主线程 (server.Server) 发起连接请求。
  2. 连接处理:

    • 服务器主线程接受连接,并为该客户端创建一个专用的处理线程 (server.ServerReaderThread)。
    • 同时,客户端的登录窗口会打开聊天主窗口 (ui.ClientChatFrame),并启动一个专门的接收线程 (ui.ClientReaderThread) 来监听服务器消息。
  3. 消息通信:

    • 发送消息:当用户在聊天窗口中发送消息时,请求被发送到服务器上对应的处理线程。
    • 消息广播:服务器处理线程接收到消息后,会将其广播给所有在线客户端的接收线程。
    • 接收与显示:客户端的接收线程收到广播消息后,会更新聊天窗口的界面,将新消息显示出来。用户列表的更新也遵循此流程。