「局域网群聊室」——Java Swing + TCP 从零到可运行(附完整源码与动图效果)
·
30 分钟撸一个「局域网群聊室」——Java Swing + TCP 从零到可运行(附完整源码与动图效果)
作者:灰太狼
日期:2025-12-10
关键词:Java 局域网聊天、Swing GUI、TCP Socket、群聊、即时通讯、FlatLaf
一、最终效果抢先看




二、技术选型理由
| 模块 | 技术 | 说明 |
|---|---|---|
| GUI | Java Swing + FlatLaf | 无需学 JavaFX,Swing 够轻;FlatLaf 一秒变现代化 |
| 网络 | TCP 长连接 | 局域网丢包率低,TCP 保证可靠送达 |
| 并发 | 单线程接收 + SwingWorker | 简单、够用 |
| 序列化 | Java ObjectIO | 快速开发,后期可换成 JSON/Protobuf |
| 打包 | 单 JAR | java -jar LanChat.jar 即可跑 |
三、架构图(10 秒看懂)
┌-------------┐ TCP 8989 ┌-------------┐
│ ChatClient │ 〈--- Socket ---〉 │ ChatServer │
│ - receive │ │ - broadcast│
│ - send │ │ - userList │
└-------------┘ └-------------┘
↑ ↑
│ Swing EDT │ Thread-Per-Client
┌-------------┐
│LanChatMainFrame
└-------------┘
四、源码目录(直接复制即可跑)
com.wlcSky.网络请求.实战项目
├─ LiveChat.java // 启动入口
├─ GUI
│ ├─ ChatLoginFrame.java // 登录
│ └─ LanChatMainFrame.java // 主面板
└─ 服务_客户端
├─ ChatServer.java // 服务端
├─ ChatClient.java // 客户端
└─ ChatMessage.java // 消息实体
五、核心代码片段(完整版在文末)
1. 启动类:LiveChat.java
public static void main(String[] args) {
FlatLightLaf.setup(); // 现代皮肤
UIManager.put("TextComponent.arc", 8);
SwingUtilities.invokeLater(() -> new ChatLoginFrame().setVisible(true));
}
2. 登录校验:ChatLoginFrame.java
private void handleEnter() {
String nickname = nicknameField.getText().trim();
if (nickname.isEmpty()) {
JOptionPane.showMessageDialog(this, "请输入您的昵称!");
return;
}
new LanChatMainFrame(nickname).setVisible(true);
dispose();
}
3. 客户端收发线程:ChatClient.java
public boolean connect() {
socket = new Socket("localhost", 8989);
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
out.writeObject(new ChatMessage(Type.JOIN, nickname, ""));
new Thread(this::receiveMessages).start();
return true;
}
private void receiveMessages() {
ChatMessage msg;
while ((msg = (ChatMessage) in.readObject()) != null) {
switch (msg.getType()) {
case MESSAGE -> ui.appendMessage(msg.getSender() + ": " + msg.getContent());
case USER_LIST -> ui.updateOnlineUsers(msg.getUserList());
}
}
}
4. 服务端广播:ChatServer.java
private void broadcast(ChatMessage msg) {
for (ClientHandler c : clients) c.sendMessage(msg);
}
// 用户离开/加入自动刷新列表
public synchronized void updateUserList() {
broadcast(new ChatMessage(Type.USER_LIST, new ArrayList<>(onlineUsers)));
}
六、运行步骤(3 步)
- 把代码粘到 IDEA/Eclipse,JDK 8+ 即可。
- 先运行
ChatServer.main→ 控制台打印 “✅ 聊天服务器已启动”。 - 运行
LiveChat.main→ 弹出登录框,输入昵称,即可群聊。
局域网其他电脑把
localhost改成服务器 IP 即可加入!
七、打包成单 JAR
# Maven 插件快速打包(非 Maven 也可手动导出)
mvn clean package
java -jar target/lan-chat-1.0.0.jar
八、可继续二次开发的方向
| 功能 | 实现思路 |
|---|---|
| 私聊 | ChatMessage 新增 receiver 字段,服务端定向转发 |
| 文件传输 | 字节数组 + DataOutputStream#writeLong 分块 |
| emoji/图片 | Swing 插入 ImageIcon 到 JTextPane |
| 账号密码 | 数据库轻量级 SQLite 做登录校验 |
| Web 端 | 端口映射 + WebSocket 版,多端互通 |
九、常见 FAQ
Q1 无法连接服务器?
- 检查防火墙是否放行 8989 端口;
- 确认服务器 IP 填对,用
ping/telnet IP 8989测试。
Q2 中文乱码?
- 全程使用
ObjectIO,未直接操作字节,默认 UTF-16BE,无需额外设置。
Q3 想换端口?
- 全局搜索
8989替换成你想要的即可。
十、总结
整套代码不到 500 行,零依赖(仅 FlatLaf 可注释),校园网、公司内网、宿舍开黑完全够用。
看完别忘了 一键三连 ➕ 收藏,来领取源码。评论区贴出你的升级版,一起交流!
全文完,如有 bug 或优化点,欢迎评论区轰炸,灰太狼 24h 在线回复~
更多推荐



所有评论(0)