11 KiB
TCP 局域网点对点聊天系统
基于 Java Socket 编程实现的 TCP 点对点聊天系统,支持在 openEuler 和 Windows 系统上运行。
🌐 在线访问地址:http://120.46.87.202:8080
功能特性
- ✅ 基于 TCP 协议的可靠连接
- ✅ 支持多用户同时在线
- ✅ 点对点私聊功能
- ✅ 实时在线用户列表
- ✅ 心跳保活机制
- ✅ 优雅的连接管理
- ✅ Web图形界面客户端(美观易用)
- ✅ WebSocket实时通信
- ✅ 响应式设计(支持移动端)
- ✅ 云服务器部署(公网访问)
- ✅ 文件传输(支持任意文件类型)
- ✅ 图片传输与显示(自动预览)
- ✅ 视频传输与播放(内置播放器)
- ✅ 音频传输与播放(支持多种格式)
- ✅ 语音聊天(实时录制和播放)
项目结构
src/
├── common/ # 公共类
│ ├── Message.java # 消息实体类
│ └── MessageType.java # 消息类型枚举
├── server/ # 服务器端
│ ├── ChatServer.java # TCP聊天服务器
│ ├── ClientHandler.java # TCP客户端处理器
│ ├── WebSocketServer.java # WebSocket服务器(Web客户端)
│ └── WebSocketClient.java # WebSocket客户端处理器
└── client/ # 客户端
└── ChatClient.java # 命令行聊天客户端
lib/
└── gson-2.10.1.jar # JSON处理库
技术实现
核心技术
- Socket 编程: 使用 Java Socket API 实现 TCP 通信
- 多线程: 使用线程池处理多客户端并发连接
- 对象序列化: 使用 ObjectInputStream/ObjectOutputStream 传输消息对象
- 并发控制: 使用 ConcurrentHashMap 管理在线用户
通信协议
- LOGIN: 用户登录
- LOGOUT: 用户登出
- PRIVATE_MSG: 私聊消息
- USER_LIST: 在线用户列表
- FILE: 普通文件传输
- IMAGE: 图片文件传输
- VIDEO: 视频文件传输
- AUDIO: 音频文件传输
- VOICE: 语音消息
- HEARTBEAT: 心跳包
- ACK: 确认消息
快速开始
🚀 一键启动(最简单)
Linux/openEuler:
chmod +x quick_start.sh
./quick_start.sh
Windows:
quick_start.bat
然后在浏览器打开 http://localhost:8080 即可使用!
📋 完整启动菜单
如果需要选择启动模式(Web服务器、TCP服务器、客户端等):
Linux/openEuler:
chmod +x start_all.sh
./start_all.sh
Windows:
start_all.bat
🛑 停止所有服务
Linux/openEuler:
chmod +x stop_all.sh
./stop_all.sh
Windows:
stop_all.bat
方式一:Web图形界面客户端(推荐)
1. 下载依赖库
Linux/openEuler:
chmod +x download_gson.sh
./download_gson.sh
Windows:
download_gson.bat
2. 编译Web版本
Linux/openEuler:
chmod +x compile_web.sh
./compile_web.sh
Windows:
compile_web.bat
3. 启动WebSocket服务器
Linux/openEuler:
chmod +x run_web_server.sh
./run_web_server.sh
Windows:
run_web_server.bat
服务器默认监听端口: 8080
4. 打开浏览器访问
在浏览器中打开:http://localhost:8080
多个用户可以同时打开多个浏览器标签页或不同浏览器进行聊天。
方式二:命令行客户端
1. 编译项目
Linux/openEuler:
chmod +x compile.sh
./compile.sh
Windows:
compile.bat
2. 启动服务器
Linux/openEuler:
chmod +x run_server.sh
./run_server.sh
Windows:
run_server.bat
服务器默认监听端口: 8888
3. 启动客户端
Linux/openEuler:
chmod +x run_client.sh
./run_client.sh
Windows:
run_client.bat
4. 使用说明
Web客户端使用
- 在浏览器中打开
http://localhost:8080 - 输入用户名登录
- 在左侧用户列表中选择要聊天的用户
- 在底部输入框输入消息,点击发送或按回车键
- 支持多个浏览器标签页同时登录不同用户
命令行客户端使用
启动客户端后,按提示输入:
- 服务器地址(默认 localhost)
- 服务器端口(默认 8888)
- 用户名
聊天命令:
@用户名 消息内容- 发送私聊消息quit- 退出程序
示例:
@张三 你好,在吗?
@李四 收到,马上处理
quit
使用场景
场景1:在线Web聊天(最简单)
无需安装任何软件,直接使用!
- 用户A在浏览器打开
http://120.46.87.202:8080,输入用户名 Alice - 用户B在浏览器打开
http://120.46.87.202:8080,输入用户名 Bob - Alice 在左侧选择 Bob,输入消息发送
- Bob 在左侧选择 Alice,输入消息回复
- 支持多个用户同时在线,界面美观易用
特点:
- ✅ 无需下载安装
- ✅ 支持手机、平板、电脑
- ✅ 跨平台使用
- ✅ 实时通信
场景2:局域网Web聊天
- 在服务器机器上启动WebSocket服务器(假设IP: 192.168.1.100)
- 用户A在浏览器打开
http://192.168.1.100:8080,输入用户名 Alice - 用户B在浏览器打开
http://192.168.1.100:8080,输入用户名 Bob - Alice 在左侧选择 Bob,输入消息发送
- Bob 在左侧选择 Alice,输入消息回复
- 支持多个用户同时在线,界面美观易用
场景3: 局域网内命令行聊天
- 在服务器机器上启动TCP服务器(假设IP: 192.168.1.100)
- 在客户端A上启动客户端,输入服务器地址 192.168.1.100,用户名 Alice
- 在客户端B上启动客户端,输入服务器地址 192.168.1.100,用户名 Bob
- Alice 输入
@Bob 你好发送消息给 Bob - Bob 输入
@Alice 你好回复消息给 Alice
场景3: openEuler 云服务器部署
- 在 openEuler 服务器上编译并启动WebSocket服务器
- 确保防火墙开放 8080 端口(Web版)或 8888 端口(命令行版)
- 客户端使用服务器公网IP连接
- Web客户端直接在浏览器访问,无需安装任何软件
系统要求
- JDK 8 或更高版本
- Linux (openEuler 推荐) 或 Windows 操作系统
- 局域网或互联网连接
防火墙配置
openEuler/CentOS:
# Web版本 - 开放8080端口
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
# 命令行版本 - 开放8888端口
sudo firewall-cmd --zone=public --add-port=8888/tcp --permanent
sudo firewall-cmd --reload
Ubuntu:
# Web版本
sudo ufw allow 8080/tcp
# 命令行版本
sudo ufw allow 8888/tcp
扩展功能(可选)
系统架构支持以下扩展:
- 文件传输(已预留 FILE 消息类型)
- 图片传输与显示
- 音视频文件传输
- 语音聊天
开发说明
添加新功能
- 在
MessageType.java中添加新的消息类型 - 在
Message.java中添加必要的字段 - 在
ClientHandler.java中处理新消息类型 - 在
ChatClient.java中实现客户端逻辑
调试技巧
- 服务器端会打印所有连接和消息日志
- 客户端会显示接收到的所有消息
- 使用
netstat -an | grep 8888查看端口状态
Web界面特性
- 🎨 现代化渐变背景设计
- 💬 实时消息推送
- 👥 在线用户列表实时更新
- 📱 响应式布局,支持移动端
- ⌨️ 支持回车键快速发送
- 🎯 消息气泡样式,左右区分
- ⏰ 消息时间戳显示
- 🔔 用户上下线提醒
- ✨ 平滑动画效果
- 📎 文件传输(支持拖拽上传)
- 🖼️ 图片预览(点击放大查看)
- 🎬 视频播放(内置播放器)
- 🎵 音频播放(支持多种格式)
- 🎤 语音消息(一键录制)
多媒体功能使用
Web客户端
发送文件
- 点击输入框左侧的 📎 按钮
- 选择要发送的文件(图片、视频、音频或其他文件)
- 文件会自动发送给当前聊天对象
- 文件大小限制:5MB(建议压缩大文件)
发送语音消息
- 点击输入框右侧的 🎤 按钮开始录音
- 按钮变为 ⏹️ 表示正在录音
- 再次点击停止录音并发送
- 注意:需要授予浏览器麦克风权限
查看多媒体内容
- 图片:自动显示在聊天界面,点击可放大查看
- 视频:显示视频播放器,点击播放按钮观看
- 音频:显示音频播放器,点击播放按钮收听
- 语音:显示语音播放控件和时长
- 普通文件:显示文件信息,点击"下载"按钮保存
TCP客户端(命令行)
发送文件
/file @用户名 文件路径
示例:
# 发送图片
/file @Alice photo.jpg
# 发送视频
/file @Bob video.mp4
# 发送文档
/file @Charlie document.pdf
接收文件
- 文件自动保存到
downloads目录 - 文件名格式:
用户名_原文件名 - 控制台显示文件信息和保存路径
支持的文件格式
| 类型 | 格式 | 大小限制 | 说明 |
|---|---|---|---|
| 图片 | JPG, PNG, GIF, BMP, WebP | 2MB | 自动预览,建议压缩 |
| 视频 | MP4, WebM, AVI, MOV | 2MB | 内置播放器,建议使用短视频 |
| 音频 | MP3, WAV, OGG, M4A | 2MB | 内置播放器 |
| 语音 | WebM, OGG | 2MB | 录制格式 |
| 其他 | 任意格式 | 2MB | 下载保存 |
注意: Web 客户端文件大小限制为 2MB,超过此大小请使用 TCP 命令行客户端(支持更大文件)。
麦克风权限设置
如果无法使用语音功能,请参考:麦克风权限设置指南
快速解决:
- 点击浏览器地址栏左侧的锁图标 🔒
- 找到"麦克风"选项,选择"允许"
- 刷新页面(F5)
注意: 语音功能需要在安全上下文中使用(HTTPS 或 localhost)
常见问题
Q: Web客户端连接失败? A: 检查WebSocket服务器是否启动、浏览器是否支持WebSocket、防火墙是否开放8080端口
Q: 命令行客户端连接失败? A: 检查TCP服务器是否启动、IP地址是否正确、防火墙是否开放8888端口
Q: 消息发送失败? A: 确认接收者用户名正确且在线
Q: 发送图片后断开连接? A: 文件过大导致,建议:
- 压缩图片后再发送
- 文件大小不超过5MB
- 使用TCP客户端发送大文件
Q: 无法使用语音功能? A: 检查:
- 浏览器是否授予麦克风权限
- 是否通过 HTTPS 或 localhost 访问
- 浏览器是否支持(Chrome 60+, Firefox 55+)
- 详见 麦克风权限设置指南
Q: 视频/音频无法播放? A: 确认:
- 浏览器支持该格式
- 文件未损坏
- 推荐格式:MP4 (视频), MP3 (音频)
Q: 如何修改端口?
A: Web版修改 WebSocketServer.java 中的 PORT 常量(默认8080)
命令行版修改 ChatServer.java 中的 PORT 常量(默认8888)
Q: Gson库下载失败? A: 可以手动下载 gson-2.10.1.jar 并放置在 lib 目录下 下载地址: https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar
相关文档
作者
网络编程实验项目
许可证
MIT License