基于 Qt 的 TCP 网络通信

TCP通信特点:
TCP 是一个面向连接的,安全的,流式传输协议,这个协议是一个传输层协议。
面向连接:是一个双向连接,通过三次握手完成,断开连接需要通过四次挥手完成。
安全:tcp 通信过程中,会对发送的每一数据包都会进行校验,如果发现数据丢失,会自动重传
流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致。
UDP 是一个面向无连接的,不安全的,报式传输协议,同样也是一个传输层协议。

大致流程为:TCP服务器端建立套接字,然后进行绑定和监听,接着等待客户端的连接请求。如果连接成功会得到一个用于通信的文件描述符,用这个描述符进行读写操作,通信完成断开连接。对于TCP客户端的话就相对简单一些,只需要创建通信套接字,然后通过服务器的IP和端口进行连接,连接成功进行通信操作,最后断开连接。
下面是基于QT的TCP通信
Qt 提供了两个类来进行TCP 的套接字通信:
QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。
QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。
这两个套接字通信类都属于网络模块 network。

常用 API 函数:
1. QTcpServer
构造函数
给套接字设置监听
每次有新连接可用时都会发出 newConnection () 信号
在通过QTcpSocket *QTcpServer::nextPendingConnection()来获取用于通信的文件描述符
2. QTcpSocket
QTcpSocket 是一个套接字通信类,不管是客户端还是服务器端都需要使用。在 Qt 中发送和接收数据也属于 IO 操作(网络 IO)。
构造函数
连接服务器,需要指定服务器端绑定的IP和端口信息(两种都可以)
在 Qt 中不管调用读操作函数接收数据,还是调用写函数发送数据,操作的对象都是本地的由 Qt 框架维护的一块内存。因此,调用了发送函数数据不一定会马上被发送到网络中,调用了接收函数也不是直接从网络中接收数据,关于底层的相关操作是不需要使用者来维护的。
接收数据
// 将当前可用操作数据全部读出,通过返回值返回读出的字符串
发送数据
// 发送参数指定的字符串
在使用 QTcpSocket 进行套接字通信的过程中,如果该类对象发射出 readyRead() 信号,说明对端发送的数据达到了,之后就可以调用 read 函数接收数据了。
调用 connectToHost() 函数并成功建立连接之后发出 connected() 信号
在套接字断开连接时发出 disconnected() 信号

QT具体通信流程
服务器端:
创建套接字服务器 QTcpServer 对象
通过 QTcpServer 对象设置监听,即:QTcpServer::listen()
基于 QTcpServer::newConnection() 信号检测是否有新的客户端连接
如果有新的客户端连接调用 QTcpSocket *QTcpServer::nextPendingConnection() 得到通信的套接字对象
使用通信的套接字对象 QTcpSocket 和客户端进行通信

头文件:
.cpp文件
客户端
创建通信的套接字类 QTcpSocket 对象
使用服务器端绑定的 IP 和端口连接服务器 QAbstractSocket::connectToHost()
使用 QTcpSocket 对象和服务器进行通信

头文件:
.cpp文件
