该文章参考于: 点击链接
- 这是一个使用 Java 实现的简单局域网聊天室项目。项目包含服务器端和客户端两部分,使用 Java Socket 进行通信,并使用 Swing 构建图形用户界面。
- 对应课程链接:黑马程序员Java+AI智能辅助编程全套视频教程,java零基础入门到大牛一套通关-p179
功能概述
服务器端
- 监听连接: 服务器在指定端口(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
这个图表描述了以下工作流程:
-
启动与登录:
- 用户启动客户端 (ui.App),打开登录窗口 (ui.ChatEntryFrame)。
- 用户输入昵称后,客户端向服务器主线程 (server.Server) 发起连接请求。
-
连接处理:
- 服务器主线程接受连接,并为该客户端创建一个专用的处理线程 (server.ServerReaderThread)。
- 同时,客户端的登录窗口会打开聊天主窗口 (ui.ClientChatFrame),并启动一个专门的接收线程 (ui.ClientReaderThread) 来监听服务器消息。
-
消息通信:
- 发送消息:当用户在聊天窗口中发送消息时,请求被发送到服务器上对应的处理线程。
- 消息广播:服务器处理线程接收到消息后,会将其广播给所有在线客户端的接收线程。
- 接收与显示:客户端的接收线程收到广播消息后,会更新聊天窗口的界面,将新消息显示出来。用户列表的更新也遵循此流程。