# XJTU-netlab-ChatRoom
西安交通大学计算机网络最终实验-聊天室
## 功能要求
- [x] 使用用户名和密码验证用户登陆
- [x] 允许用户注册, 返回一个10位数字的账号
- [x] 用户之间可以用文字聊天
- [x] 离线传输文件
- [x] 双方在线时用NAT传输文件
- [x] 语音聊天
## 实现策略
1. 服务器端使用数据库维护用户信息
2. 服务器端暂存用户发送的消息, 用户上线时通知服务器, 并接受消息. 服务器传达消息后删除暂存的消息
3. 在传输文件之前, 先通告文件的大小, 文件名和哈希值, 服务端检查文件名是否存在, 哈希值是否相等, 如果存在且哈希值不相等则启动断点续传, 从服务端接受到的文件大小处开始接受文件
4. 当收发双方都在线时, 则启动NAT协议, 服务器端告知双方IP地址和端口, 双方直接连接
5. 语音聊天仅当双方都在线时有效, 双方维护两条UDP连接, 分别发送自己的语音流和接收对方的语音流
## 实现细节
### 用户登陆
客户端在本地查询要求输入用户名和密码
客户端向服务器端申请连接, 然后发送登录报文
```json
{
"type": "login",
"username": "<username>",
"password": "<password>"
}
```
服务端收到报文后, 维持和客户端的连接, 并在数据库中查询用户信息, 如果用户信息存在且正确, 则维持连接并发送登录成功的报文; 否则发送登录失败的报文, 并断开连接
接着服务端维护用户名到用户地址的映射
服务端检查消息队列, 如果队列中有目的为这个用户的消息, 则发送之
### 用户注册
客户端在本地获得用户信息后向服务器端申请连接, 然后发送注册报文
```json
{
"type": "signup",
"username": "<username>",
"password": "<password>"
}
```
服务端收到报文后, 维持和客户端的连接, 并在数据库中查询用户信息, 如果用户信息不存在, 则将用户信息写入数据库, 并返回注册成功的报文; 如果用户名已存在, 则返回要求改名的报文; 否则返回注册失败的报文, 并断开连接
### 文字聊天
客户端首先向服务器发送报文
```json
{
"type": "chat",
"from": "<selfname>",
"to": "<username>",
"content": "<content>"
}
```
服务端收到消息后, 首先检查收信人是否在线, 若在线则直接转送, 若不在线则暂存于消息队列中. 每有一个用户登录, 服务器都检查消息队列, 并将消息转送之
### 文件传输
客户端首先在自身开启一个TCP套接字用于发送文件, 向服务器发送文件传输请求报文
```json
{
"type": "ftp_request",
"from": "<selfname>",
"to": "<username>",
"filename": "<filename>",
"ip": <self ip>,
"port": <self port>
}
```
服务端收到请求报文后, 首先检查收信人是否在线
如果收信人在线, 则服务端向收信人转发该ftp请求报文
收信人收到连接开启报文后, 向报文中的地址发起连接
若收信人不在线, 则服务端开始接收文件. 收信人接收文件的行为和服务端类似
发信人收到连接开启报文后, 循环发送固定大小的文件片段, 直到文件发送完成
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
计算机网络最终实验-聊天室 功能要求 使用用户名和密码验证用户登陆 允许用户注册, 返回一个10位数字的账号 用户之间可以用文字聊天 离线传输文件 双方在线时用NAT传输文件 语音聊天 实现策略 服务器端使用数据库维护用户信息 服务器端暂存用户发送的消息, 用户上线时通知服务器, 并接受消息. 服务器传达消息后删除暂存的消息 在传输文件之前, 先通告文件的大小, 文件名和哈希值, 服务端检查文件名是否存在, 哈希值是否相等, 如果存在且哈希值不相等则启动断点续传, 从服务端接受到的文件大小处开始接受文件 当收发双方都在线时, 则启动NAT协议, 服务器端告知双方IP地址和端口, 双方直接连接 语音聊天仅当双方都在线时有效, 双方维护两条UDP连接, 分别发送自己的语音流和接收对方的语音流 实现细节 用户登陆 客户端在本地查询要求输入用户名和密码 客户端向服务器端申请连接, 然后发送登录报文 { "type": "login", "username": "<username>", "password": "<password>" } 服务端收到报
资源推荐
资源详情
资源评论
收起资源包目录
chatroom-python-main.zip (10个子文件)
chatroom-python-main
.DS_Store 6KB
main.py 593B
LICENSE 34KB
client
__init__.py 11KB
.gitignore 3KB
server
__init__.py 14KB
database.py 1KB
README.md 3KB
config
server_config.py 22B
audio_config.py 99B
共 10 条
- 1
资源评论
Mrrunsen
- 粉丝: 9520
- 资源: 514
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- NVIDIA RTX A2000显卡驱动
- 系统编译时候依赖不同的版本的glibc
- 前端面试知识点汇总与解析(超全面)-前端面试八股文
- 超全前端面试题大全-自用!真的超级全面
- 记录让Element-UI的ElPopover组件支持鼠标右键弹出
- libevent http server
- java学习项目:基于java获取水仙花数并判断一个数是否为水仙花完整源码分享
- Pano2vr7制作的360度全景html5网页,有2个场景切换,可用电脑、pico4 VR眼镜、苹果和安卓手机浏览器查看
- ubuntu 22.04 安装 CH340串口驱动
- Screenshot_20241112_113258.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功