c++ Qt 网络连接

1、基础概念

1.1 TCP/UDP

  • TCP

是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、

数据无失序、数据无重复到达的通信)

适用情况:

1.SN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

2、适合于对传输质量要求较高,以及传输大量数据的通信。

高可靠的原因:

  1. 三次握手,四次挥手
  2. 序列号和应答号机制
  3. 超时/错误 重传机制

UDP(User Datagram Protocol)用户数据报文协议,是不可靠的无连接的协议。

在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

即时性

1、发送小尺寸数据(如对DNS服务器进行IP地址查询时)

2、QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议

3、流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输

1.2 IP地址与端口号

IP地址:

1、IP地址是internet中的主机标识

2、internet中的主机要与别的机器通信必须具有一个IP地址

3、IP地址为32位(IPv4)或者128位(IPv6)

4、表示形式:常用点分形式,如202.38.64.10,最后都会转换为一个32位的无符号整数。

五类:A B C D E

端口号

1、为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区分。

2、TCP端口号与UDP端口号独立。

3、端口用两个字节来表示:2byte

4、众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)

已登记端口:1024~49151(选1000以上,10000以下)

动态或私有端口:49152~65535 --固定某些服务使用-

非豹子号端口号,本次授课使用8887端口号

2、准备工作

与数据库编程一样,Qt的网络功能需要在.pro项目配置文件中添加对应模块。network模块。

网络通信当中主要用到两个类:

  • QTcpServer

表示一个基于TCP的服务器,需要注意的是,此类直接继承了QObject类,不继承QIODevice类,因此不具备任何IO能力。

  • QTcpSocket

表示一个基于TCP的Socket连接,间接继承了QIODevice类,因此使用此类对象进行IO读写。

3、相关函数

复制代码
// 构造函数,堆内存开辟`
`QTcpServer:: QTcpServer(QObject * parent = 0)`
`
复制代码
// 开启监听服务,等待客户端发起连接`
`// 参数1:监听来源(那个网段的ip地址),默认值不加任何限制`
`// 参数2:服务器所占用的端口号。默认值0表示随机选取`
`bool QTcpServer:: listen(const QHostAddress & address = QHostAddress::Any, quint16 port = 0)`
`
复制代码
// 查看当前是否在监听`
`bool QTcpServer:: isListening() const`
`
复制代码
// 关闭监听服务`
`void QTcpServer:: close()`
`

编写客户端:

复制代码
// 构造函数 堆区创建`
`QTcpSocket:: QTcpSocket(QObject * parent = 0)`
`
复制代码
// 连接到服务器`
`// 参数1:服务器的IP地址`
`// 参数2:服务器的端口号`
`// 参数3:打开模式`
`void QAbstractSocket:: connectToHost(const QString & hostName, quint16 port, OpenMode openMode = ReadWrite)[virtual]`
`
复制代码
// 每当有新的连接可用是,就会发射此信号`
`void QTcpServer:: newConnection() [signal]`
`
复制代码
// 返回与哭护短连接的QTcpSocket对象`
`QTcpSocket * QTcpServer:: nextPendingConnection()`
`
复制代码
// 获取对面(客户端)的IP地址`
`// 返回值为IP地址封装类`
`QHostAddress QAbstractSocket:: peerAddress() const`
`
复制代码
// 返回值对面的(客户端)端口号`
`quint16 QAbstractSocket:: peerPort() const`
`
复制代码
// 构造函数`
`// 参数是Qt的读写类,可以使QFile、也可以是QTcpSocket.......`
`QTextStream:: QTextStream(QIODevice * device)`
`
复制代码
// 输出字符串内容,支持链式调用`
`QTextStream &	operator<<(const QString & string)`
`
复制代码
// 有数据可读时发射`
`void QIODevice:: readyRead() [signal]`
`
复制代码
// 读取数据,参数为本次读取数据最大长度,返回值为读取的字符串。`
`QString QTextStream:: read(qint64 maxlen)`
`
相关推荐
imX2G几秒前
爆破小游戏2.0
c++
Cx330❀1 小时前
【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列
c++·算法
Cx330❀1 小时前
【优选算法必刷100题】第038题(位运算):消失的两个数字
开发语言·c++·算法·leetcode·面试
Loo国昌1 小时前
深入理解 FastAPI:Python高性能API框架的完整指南
开发语言·人工智能·后端·python·langchain·fastapi
燃于AC之乐1 小时前
我的算法修炼之路--5——专破“思维陷阱”,那些让你拍案叫绝的非常规秒解
c++·算法·贪心算法·bfs·二分答案·扩展域并查集·动态规划(最长上升子序列)
艾莉丝努力练剑1 小时前
【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值
数据结构·c++·算法·leetcode·stl
hoiii1871 小时前
16APSK/32APSK调制解调MATLAB仿真实现
开发语言·matlab·fpga开发
济6172 小时前
linux 系统移植(第十七期)---Linux 内核移植(5)-- 修改网络驱动(2)--- Ubuntu20.04
linux·运维·网络
feifeigo1232 小时前
基于MATLAB的情感语音模板培训与识别实现方案
开发语言·matlab
JH30732 小时前
Java Spring中@AllArgsConstructor注解引发的依赖注入异常解决
java·开发语言·spring