# 基于TCP和UDP Socket编程实现的网路聊天室支持文件传输
# 1、环境
## 1.1 开发平台
Intel i5处理器,4GB内存,500GB机械硬盘,1GBps网卡速率;操作系统为Windows 10,开发平台为Qt creator5.9.2,除Qt的部分动态链接库以外,无其他组件。
## 1.2 运行平台
服务器运行平台与开发平台相同,由于需要多个用户同时在线,故其中一个用户也运行在开发平台上;其他用户运行在虚拟机上,虚拟机是Vmware workstation上安装的Windows 7虚拟机,内存2GB,磁盘空间50GB。第三方组件为Qt的动态链接库。
# 2、系统功能需求
基于TCP和UDP协议实现一个即时通讯工具,具体功能要求包括:
- 工具包括服务器端和客户端
- 具备用户注册、登录、找回密码功能(基于TCP协议)
- 两个用户如果同时在线,采用点到点通信方式进行聊天,信息不需要通过服务器中转,服务器也不保存,且消息要在五秒内送达对方(基于TCP协议)
- 支持离线消息,且在登录后一分钟内全部收到(基于TCP协议)
- 支持点到点可靠文件传输(基于UDP协议)
- 存储在服务器端的数据需要进行强加密
- 支持不少于两组用户同时在线交流和传输文件
- 文件传输具有良好的性能,能够充分利用网路带宽
- 人机交互友好,软件易用性强
# 3、系统设计
## 3.1 系统架构
由于开发环境是qt,而qt中有其独特的信号和槽机制,通过信号的触发来调用槽函数,所以系统的功能函数基本都是槽函数,通过用户的按键等操作来实现调用,所以不像一般的系统都是一个主函数调用若干个子功能函数,本系统中的众多功能函数相对比较分散、独立,各有各的触发开关,执行自己的功能。
## 3.2 功能模块
由于系统分为服务器和客户端,所以功能模块也需要各自讨论。
### 3.2.1 服务器
服务器主要功能是接受用户的注册消息、登录消息和离线消息等,所以主要功能模块如下:
- **用户连接**:处理用户的tcp连接请求
- **注册功能**:处理用户的注册消息
- **找回密码**:处理用户的找回密码请求
- **获取IP**:用于处理聊天的用户发来的获取IP的请求
- **离线消息**:处理用户发来的离线消息
- **获取用户列表**:获取所有用户,区分在线和离线用户
- **保存&读取数据**:保存已注册用户的所有账号信息并加密,读取用户信息并解密
### 3.2.2 客户端
客户端的功能远远多于服务器,大体上可以分成tcp模块和udp模块,而这两个模块下又有很多子模块。
- **注册账号**:新用户注册新账号
- **找回密码**:老用户根据密保问题找回密码
- **登录**:最基本的功能,是聊天和发文件的基础
- **文本聊天**:选择好友进行文字聊天
- **文件传送**:选择好友进行文件传输
- **接收聊天信息**:接受好友或服务器发来的聊天信息并显示
- **接收文件**:接受好友发来的文件并保存
- **界面控制**:根据不同的用户状态,在界面上显示或隐藏不同的控件
- **获取好友列表**:获取所有好友,并在列表中显示器账号
## 3.3 应用层协议
### 3.3.1 文本传输
用Qbytearray向qtcpsocket中写入数据,为了供数据接收方识别,需要根据数据的功能加上各自的头部,比如注册信息可加上“reg”头部,普通聊天消息可加“msg”,发送方要根据当前用户所处的状态来加不同的头部,而接收方在取出头部后,需要根据头部的值来判断这是何种信息,接下来该执行何种操作,这是应用层协议的关键,双方需要协商好每一种信息使用何种头部。
### 3.3.2 文件传输
使用qdatastream向qudpsocket中写入从文件中读出的数据,每个包的数据长度自己定义,由于udp只用于文件传输,所以发送和接收方都不会发生混淆,不需要加消息头部标识,但是还是需要在头部添加数据包的序号。接收方采用累积确认法,接受一个包就发送该包对应序号的ack,当收到的数据包不是已确认序号的下一个时,仍发送最后一个已确认序号的ack信号。发送方采用快速重传法,并且使用tcp reno算法控制拥塞窗口大小。当收到三个冗余的ack时,重新发送冗余ack后的所有分组,窗口长度减半,当发生超时,拥塞窗口减为1,再用慢启动恢复窗口长度。
# 4、系统实现
## 4.1 服务器
**保存&读取数据**:这是服务器一切功能的基础。服务器启动时,从内存中导入已注册用户的信息,形成一个用户链表,表中的每个结点分别对应一个用户,其中存放了用户的账号、密码等个人信息,此外还有是否在线的标记,以及与服务器建立连接的tcp套接字。
在读取文件恢复链表时, 只需要恢复账号密码信息即可,其他在线信息暂且不用管。在保存数据时,也只需要保存账号信息。需要注意的是,对于密码,需要进行加密然后再写入文件,读出文件时使用与之配套的解密算法进行解密。
从内存读取数据并恢复用户链表的流程图如下图所示,保存数据的过程与之类似,但顺序相反。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/68a92bfe0533191a86e242bcd2bfdd2c.writebug)
**用户连接**:当有用户发送连接请求时,服务器要用一个套接字来与之连接。与服务器进行连接的用户有多种情况:注册、找回密码和登录,对于前两种情况,该套接字在操作完成后就失效了,但对于登录的用户,则需要长久保持连接。因此,我们先创建一个套接字建立这一连接,等到确认该用户是登录用户时,就将该套接字挂载到用户链表中的对应节点上,并将链表中用户是否在线的标志变量置为1,并获取登录方的IP地址,也存到用户结点中。若用户是进行注册和找回密码,则需要在一定时间以后销毁该套接字,以免占用内存。
客户端接受用户各类连接信息的流程图如下图所示。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/723a4472798d35536b1485d23de836ab.writebug)
**注册功能**:用户与服务器建立连接,发送注册的账号和密码,服务器到用户链表中查找是否已经存在该用户,假如不存在,则新建一个用户结点,把该用户添加到用户链表中;否则,发送注册失败的消息,告诉用户,该账号已经被注册了。
注册功能是服务器处理各类连接中的一类情况,其操作流程已经包含在服务器处理连接的流程图中。
**找回密码**:用户与服务器建立连接,发送密保问题和答案,并附带新密码。需要注意的是,我们生活中常用的软件附带的找回密码功能,实际上都是让用户设置新密码,而并不是直接把旧的密码告诉用户,因为这样更安全,所以此处也借鉴了这一做法。服务器根据用户账号去用户链表中找到该用户,判断用户的密保问题是否回答正确,若是,则将新密码替换旧密码,并反馈给用户修改成功的信息;否则,告知用户问题回答错误,无法找回密码。
找回密码功能是服务器处理各类连接中的一类情况,其操作流程已经包含在服务器处理连接的流程图中。
**获取IP**:系统要求用户点对点聊天时,消息不经过服务器,那么,用户就必须知道聊天对方的IP地址,才能与之交流,所以用户必须向服务器索要IP。服务器收到获取IP的请求后,根据用户所请求的账号,去用户链表中查找该用户是否在线,若是,则把用户的IP发回
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
20223113062519216.zip (72个子文件)
network-chatroom
src
第三方组件
说明文档.txt 375B
文档.txt 235B
源码
服务器端
login.cpp 760B
mainwindow.h 1KB
user.cpp 456B
user.h 370B
mainwindow.cpp 8KB
main.cpp 195B
login.h 486B
客户端
findpswdialog.h 495B
login.cpp 966B
mainwindow.h 3KB
user.cpp 206B
registerdialog.h 659B
user.h 180B
mainwindow.cpp 18KB
setipdialog.h 377B
main.cpp 195B
setipdialog.cpp 329B
registerdialog.cpp 879B
findpswdialog.cpp 698B
login.h 503B
可执行码
libGLESV2.dll 2.68MB
bearer
qnativewifibearer.dll 81KB
qgenericbearer.dll 88KB
server.exe 49KB
client.exe 92KB
Qt5Gui.dll 5.92MB
imageformats
qjpeg.dll 242KB
qsvg.dll 27KB
qtga.dll 26KB
qtiff.dll 438KB
qwebp.dll 439KB
qgif.dll 33KB
qicns.dll 46KB
qwbmp.dll 25KB
qico.dll 36KB
Qt5Core.dll 5.81MB
Qt5Svg.dll 352KB
Qt5Widgets.dll 6.06MB
translations
qt_lv.qm 150KB
qt_sk.qm 123KB
qt_cs.qm 171KB
qt_de.qm 184KB
qt_ja.qm 127KB
qt_fi.qm 157KB
qt_da.qm 166KB
qt_ko.qm 128KB
qt_fr.qm 162KB
qt_pl.qm 159KB
qt_it.qm 157KB
qt_bg.qm 161KB
qt_gd.qm 170KB
qt_es.qm 161KB
qt_en.qm 23B
qt_uk.qm 155KB
qt_ca.qm 175KB
qt_hu.qm 89KB
qt_he.qm 135KB
qt_ru.qm 154KB
iconengines
qsvgicon.dll 42KB
platforms
qwindows.dll 1.68MB
libwinpthread-1.dll 78KB
libEGL.dll 22KB
opengl32sw.dll 15.25MB
Qt5Network.dll 1.71MB
libstdc++-6.dll 1.47MB
D3Dcompiler_47.dll 3.31MB
libgcc_s_dw2-1.dll 118KB
socket编程.docx 743KB
LICENSE 1KB
README.md 19KB
共 72 条
- 1
资源评论
工具盒子
- 粉丝: 58
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功