You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
2 months ago | |
|---|---|---|
| .vscode | 2 months ago | |
| web | 2 months ago | |
| OPENEULER_GUIDE.md | 2 months ago | |
| P2PChat.java | 2 months ago | |
| P2PChatWebServer.java | 2 months ago | |
| README.md | 2 months ago | |
| check-server.sh | 2 months ago | |
| compile.sh | 2 months ago | |
| fix-server.sh | 2 months ago | |
| run-web.bat | 2 months ago | |
| run-web.sh | 2 months ago | |
| run.sh | 2 months ago | |
| start-server.sh | 2 months ago | |
| 一键访问.html | 2 months ago | |
| 启动说明.md | 2 months ago | |
| 如何打开网页.md | 2 months ago | |
| 快速开始.md | 2 months ago | |
| 故障排查.md | 2 months ago | |
| 访问地址.txt | 2 months ago | |
README.md
P2P 聊天程序 (基于 TCP/Java)
项目简介
这是一个基于 TCP 协议的 Java P2P 点对点聊天程序,可以在 openEuler 云服务器上运行。程序采用面向对象设计,支持多对等端连接、消息广播和文件传输功能。
功能特性
- ✅ TCP 套接字编程: 使用可靠的 TCP 协议进行通信
- ✅ P2P 架构: 每个节点既是服务器也是客户端
- ✅ 多对等端连接: 支持同时连接多个对等端
- ✅ 实时消息: 消息广播到所有连接的对等端
- ✅ 文件传输: 支持向指定对等端发送文件
- ✅ 线程池管理: 高效处理并发连接
- ✅ 命令行界面: 简洁易用的交互界面
- ✅ Web 图形界面: 现代化的浏览器界面,支持 WebSocket 实时通信
版本说明
项目提供两个版本:
1. 命令行版本 (P2PChat.java)
- 纯命令行界面
- 适合服务器端运行
- 支持 P2P 连接和文件传输
2. Web 图形界面版本 (P2PChatWebServer.java)
- 现代化的 Web 界面
- 基于 WebSocket 实时通信
- 支持多用户在线聊天
- 可通过浏览器访问
- ✅ Web 图形界面: 基于 WebSocket 的现代化 Web 界面
技术实现
核心技术
- 编程语言: Java
- 网络协议: TCP (面向连接) + WebSocket
- 套接字: ServerSocket, Socket
- 并发处理: ExecutorService 线程池
- I/O 流: BufferedReader, PrintWriter, FileInputStream, FileOutputStream
- Web 技术: HTML5, CSS3, JavaScript, WebSocket API
架构设计
命令行版本 (P2PChat)
P2PChat (主类)
├── ServerSocket (监听端口)
├── ClientHandler (处理每个连接)
│ ├── 消息接收与发送
│ ├── 文件传输
│ └── 连接管理
└── ThreadPool (线程池管理)
Web 版本 (P2PChatWebServer)
P2PChatWebServer
├── WebSocket Server (端口 8888)
│ ├── WebSocket 握手
│ ├── 消息帧解析
│ └── 客户端管理
├── HTTP Server (端口 8080)
│ ├── 静态文件服务
│ └── HTML/CSS/JS 资源
└── Web 客户端
├── index.html (页面结构)
├── style.css (样式设计)
└── app.js (WebSocket 通信)
│ ├── 消息接收与发送 │ ├── 文件传输 │ └── 连接管理 └── ThreadPool (线程池管理)
## 安装与运行
### 环境要求
- Java JDK 8 或更高版本
- openEuler 操作系统 (或其他 Linux/Windows 系统)
- 现代浏览器 (支持 WebSocket,如 Chrome, Firefox, Edge)
### 编译程序
在 openEuler 服务器上执行:
```bash
# 赋予脚本执行权限
chmod +x compile.sh run.sh run-web.sh
# 编译所有程序
./compile.sh
或手动编译:
javac P2PChat.java
javac P2PChatWebServer.java
运行程序
方式 1: 命令行版本
# 使用脚本运行
./run.sh
# 或直接运行
java P2PChat
方式 2: Web 图形界面版本 (推荐)
# 使用脚本运行
./run-web.sh
# 或直接运行
java P2PChatWebServer
然后在浏览器中访问:
- 本地访问: http://localhost:8080
- 局域网访问: http://服务器IP:8080
Windows 用户:
run-web.bat
启动流程
命令行版本:
- 输入用户名
- 输入监听端口 (默认 8888)
- 程序显示本机 IP 和端口信息
- 进入命令行界面
Web 版本:
- 启动服务器,输入用户名和端口
- 在浏览器中打开 http://localhost:8080
- 输入用户名和服务器信息
- 点击"连接"按钮开始聊天
使用说明
Web 图形界面 (推荐)
服务器端
- 运行
java P2PChatWebServer - 输入用户名和端口配置
- 服务器启动后显示访问地址
客户端
- 在浏览器中打开 http://服务器IP:8080
- 输入用户名
- 输入服务器地址和 WebSocket 端口 (默认 8888)
- 点击"连接"按钮
- 在底部输入框输入消息,点击"发送"或按回车发送
- 左侧显示在线用户列表
- 点击"断开连接"退出
界面特点:
- 🎨 现代化渐变背景设计
- 💬 实时消息显示,自己的消息显示在右侧
- 👥 在线用户列表实时更新
- 📱 响应式设计,支持移动设备
- ✨ 流畅的动画效果
命令行版本
可用命令
| 命令 | 说明 | 示例 |
|---|---|---|
connect <IP> <端口> |
连接到远程对等端 | connect 192.168.1.100 8888 |
send <消息> |
发送消息到所有对等端 | send 你好,世界! |
file <对等端> <文件路径> |
发送文件到指定对等端 | file Alice test.txt |
list |
列出所有连接的对等端 | list |
quit |
退出程序 | quit |
使用场景示例
场景 1: 两台机器互联
机器 A (192.168.1.100)
java P2PChat
请输入用户名: Alice
请输入监听端口 (默认8888): 8888
机器 B (192.168.1.101)
java P2PChat
请输入用户名: Bob
请输入监听端口 (默认8888): 8888
> connect 192.168.1.100 8888
发送消息
# 在机器 B 上
> send 你好 Alice!
# 在机器 A 上会收到
[Bob]: 你好 Alice!
场景 2: 文件传输
# 查看连接的对等端
> list
=== 已连接的对等端 ===
- Bob
# 发送文件
> file Bob document.pdf
文件发送成功: document.pdf
# 对方会收到文件,保存为 received_document.pdf
TCP 套接字编程详解
服务器端流程
1. socket() - 创建 ServerSocket
2. bind() - 绑定端口 (构造函数自动完成)
3. listen() - 监听连接 (自动完成)
4. accept() - 接受客户端连接
5. read/write() - 读写数据
6. close() - 关闭连接
客户端流程
1. socket() - 创建 Socket
2. connect() - 连接到服务器
3. read/write() - 读写数据
4. close() - 关闭连接
关键代码片段
创建服务器套接字
serverSocket = new ServerSocket(port);
Socket clientSocket = serverSocket.accept();
连接到对等端
Socket socket = new Socket(host, port);
发送和接收消息
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer.println(message); // 发送
String received = reader.readLine(); // 接收
扩展功能
程序已实现以下扩展功能:
✅ 文件传输
- 支持任意类型文件传输
- 自动处理大文件分块传输
- 接收的文件自动添加
received_前缀
🔄 可继续扩展的功能
- 图片文件的传输与显示
- 音视频文件的传输与播放
- 语音聊天功能
- 加密通信
- 用户认证
- 消息历史记录
防火墙配置 (openEuler)
如果在云服务器上运行,需要开放端口:
# Web 版本需要开放两个端口
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent # HTTP
sudo firewall-cmd --zone=public --add-port=8888/tcp --permanent # WebSocket
sudo firewall-cmd --reload
# 查看已开放端口
sudo firewall-cmd --list-ports
详细的 openEuler 运行指南请查看: OPENEULER_GUIDE.md
故障排除
问题 1: 连接被拒绝
- 检查目标机器是否已启动程序
- 检查防火墙是否开放端口
- 确认 IP 地址和端口号正确
问题 2: 编译错误
- 确认 JDK 版本 >= 8
- 检查 JAVA_HOME 环境变量
问题 3: 文件传输失败
- 检查文件路径是否正确
- 确认对等端 ID 正确
- 检查磁盘空间是否充足
项目结构
.
├── P2PChat.java # 命令行版本主程序
├── P2PChatWebServer.java # Web 版本服务器
├── web/ # Web 前端资源
│ ├── index.html # 主页面
│ ├── style.css # 样式文件
│ └── app.js # WebSocket 客户端
├── compile.sh # 编译脚本 (Linux)
├── run.sh # 运行命令行版本 (Linux)
├── run-web.sh # 运行 Web 版本 (Linux)
├── run-web.bat # 运行 Web 版本 (Windows)
├── start-server.sh # 一键启动脚本
├── 启动说明.md # 云服务器启动指南
├── 一键访问.html # 快速访问页面
├── OPENEULER_GUIDE.md # openEuler 详细运行指南
├── 快速开始.md # 快速入门指南
├── 如何打开网页.md # 网页访问详细说明
└── README.md # 项目文档
快速访问指南
详细文档:
- 🚀 启动说明.md - 云服务器启动指南(121.36.108.236)
- 🌐 一键访问.html - 打开此文件快速访问聊天室
- 📖 快速开始.md - 最快速的启动方式
- 💡 如何打开网页.md - 网页访问详细步骤
- 🐧 OPENEULER_GUIDE.md - openEuler 完整指南
🌟 当前服务器地址
访问地址: http://120.46.87.202:8080
在浏览器中打开上面的地址即可使用聊天程序!
实验报告要点
- TCP 套接字编程实现: 详细说明 socket、bind、listen、accept、connect 等函数的使用
- P2P 架构设计: 解释如何实现节点既是服务器又是客户端
- 并发处理: 说明线程池的使用和多连接管理
- 文件传输协议: 描述文件传输的实现细节
- 测试结果: 展示不同场景下的运行截图和日志
作者
实验项目 - 计算机网络课程
许可证
MIT License