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.
 
 
 
 
 
hnu202326010206 7ef2586743
6
2 months ago
.vscode 4 2 months ago
web 6 2 months ago
OPENEULER_GUIDE.md 4 2 months ago
P2PChat.java 3 2 months ago
P2PChatWebServer.java 4 2 months ago
README.md 6 2 months ago
check-server.sh 6 2 months ago
compile.sh 4 2 months ago
fix-server.sh 6 2 months ago
run-web.bat 4 2 months ago
run-web.sh 4 2 months ago
run.sh 3 2 months ago
start-server.sh 4 2 months ago
一键访问.html 6 2 months ago
启动说明.md 6 2 months ago
如何打开网页.md 6 2 months ago
快速开始.md 6 2 months ago
故障排查.md 6 2 months ago
访问地址.txt 6 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

然后在浏览器中访问:

Windows 用户:

run-web.bat

启动流程

命令行版本:

  1. 输入用户名
  2. 输入监听端口 (默认 8888)
  3. 程序显示本机 IP 和端口信息
  4. 进入命令行界面

Web 版本:

  1. 启动服务器,输入用户名和端口
  2. 在浏览器中打开 http://localhost:8080
  3. 输入用户名和服务器信息
  4. 点击"连接"按钮开始聊天

使用说明

Web 图形界面 (推荐)

服务器端

  1. 运行 java P2PChatWebServer
  2. 输入用户名和端口配置
  3. 服务器启动后显示访问地址

客户端

  1. 在浏览器中打开 http://服务器IP:8080
  2. 输入用户名
  3. 输入服务器地址和 WebSocket 端口 (默认 8888)
  4. 点击"连接"按钮
  5. 在底部输入框输入消息,点击"发送"或按回车发送
  6. 左侧显示在线用户列表
  7. 点击"断开连接"退出

界面特点:

  • 🎨 现代化渐变背景设计
  • 💬 实时消息显示,自己的消息显示在右侧
  • 👥 在线用户列表实时更新
  • 📱 响应式设计,支持移动设备
  • 流畅的动画效果

命令行版本

可用命令

命令 说明 示例
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               # 项目文档

快速访问指南

详细文档:

🌟 当前服务器地址

访问地址: http://120.46.87.202:8080

在浏览器中打开上面的地址即可使用聊天程序!

实验报告要点

  1. TCP 套接字编程实现: 详细说明 socket、bind、listen、accept、connect 等函数的使用
  2. P2P 架构设计: 解释如何实现节点既是服务器又是客户端
  3. 并发处理: 说明线程池的使用和多连接管理
  4. 文件传输协议: 描述文件传输的实现细节
  5. 测试结果: 展示不同场景下的运行截图和日志

作者

实验项目 - 计算机网络课程

许可证

MIT License