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 步)

  1. 把代码粘到 IDEA/Eclipse,JDK 8+ 即可。
  2. 先运行 ChatServer.main → 控制台打印 “✅ 聊天服务器已启动”。
  3. 运行 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 插入 ImageIconJTextPane
账号密码 数据库轻量级 SQLite 做登录校验
Web 端 端口映射 + WebSocket 版,多端互通

九、常见 FAQ

Q1 无法连接服务器?

  • 检查防火墙是否放行 8989 端口;
  • 确认服务器 IP 填对,用 ping / telnet IP 8989 测试。

Q2 中文乱码?

  • 全程使用 ObjectIO,未直接操作字节,默认 UTF-16BE,无需额外设置。

Q3 想换端口?

  • 全局搜索 8989 替换成你想要的即可。

十、总结

整套代码不到 500 行,零依赖(仅 FlatLaf 可注释),校园网、公司内网、宿舍开黑完全够用。
看完别忘了 一键三连收藏,来领取源码。评论区贴出你的升级版,一起交流!


全文完,如有 bug 或优化点,欢迎评论区轰炸,灰太狼 24h 在线回复~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐