一、前言
这篇文章将接着上述内容继续向下陈述,前文提到网络编程这块内容将拆分为四个内容,分别是主机信息查询、TCP通信、UDP通信和基于HTTP的网络应用程序。前篇文章以及讲述了第一个内容——《主机信息查询》,接下来将继续讲述第三个内容——《TCP通信》。
对于前文的《主机信息查询》的内容,可自行查看文章:C++/Qt 网络(续一)-CSDN博客
二、TCP通信
传输控制协议(TCP)是一种被大多数Internet网络协议用于数据传输的底层网络协议,它是可靠的、面向流和连接的传输协议,特别适合用于连续数据传输。
TCP通信必须先建立TCP连接,通信段分为客户端和服务器端,Qt提供QTcpSocket类和QTcpServer类,用于涉及TCP通信应用程序。服务器端程序必须使用QTcpServer进行端口监听,建立服务器,使用QTcpSocket建立连接,然后使用套接字(socket)进行通信。
1、TCP通信相关的类
QTcpServer主要用于在服务器端进行网络监听,创建网络socket连接,QTcpServer的父类是QObject,它的主要接口函数如表所示,表中列出了函数的返回值,但省略了函数的输入参数。
类型 | 函数 | 功能 |
公有函数 | void close() | 关闭服务器,停止网络监听 |
bool listen() | 在设置的IP地址和端口上进行监听,若成功就返回true | |
bool isListening() | 返回true表示服务器处于监听状态 | |
QTcpSocket *nextPendingConnection() | 返回下一个等待接入的连接 | |
QHostAddress serverAddress() | 如果服务器处于监听状态,就返回服务器地址 | |
quint16 serverPort() | 如果服务器处于监听状态,就返回服务器监听端口 | |
bool waitForNewConnection() | 以阻塞方式等待新的连接 | |
信号 | void acceptError() | 当接收一个新的连接发生错误时,此信号被发射 |
void newConnection() | 当有新的连接时,此信号被发射 | |
保护函数 | void incomingConnection() | 当有一个新的连接可用时,QTcpServer内部调用此函数,创建一个QTcpSocket对象,将其添加到内部可用新连接列表,然后发射newConnection信号 |
void addPendingConnection() | 由incomingConnection()函数调用,将创建的QTcpSocket添加到内部可用新连接列表 |
服务器端程序首先需要用函数listen()开始服务器端监听,可以设置监听的IP地址或端口,一般一个服务器程序只监听某个端口的网络连接。
当有新的客户端接入时,QTcpServer内部的函数incomingConnection()会创建一个与客户端连接的QTcpSocket对象,然后发射newConnection()信号。在与newConnection()信号关联的槽函数中,我们可以用nextPendingConnection()接收客户端的连接,然后使用QTcpSocket对象与客户端通信。
因此,在客户端与服务器端建立TCP连接后,具体的数据通信是通过QTcpSocket对象完成的。QTcpSocket类提供了TCP的接口,可以用QTcpSocket类实现标准的网络通信协议,如POP3、SMTP和NNTP等,也可以设计自定义协议。
由于QTcpSocket是从QIODevice间接继承的类,因此QTcpSocket是一种I/O设备类,它具有流数据读写功能。除了构造函数和析构函数。QTcpSocket类的其他函数都是从父类QAbstractSocket继承或重定义的。QAbstractSocket类用于TCP通信的主要接口函数如表所示,表中省略的函数的输入参数。
类型 | 函数 | 功能 |
公共函数 | void connectToHost() | 以异步方式连接到指定IP地址和端口的TCP服务器,连接成功后会发射connected()信号 |
void disconnectFromHost() | 断开socket连接,成功断开后会发射disconnected()信号 | |
void close() | 关闭socket的I/O设备,会自动调用disconnectFromHost() | |
bool waitForConnected() | 等待建立socket连接,可设置等待时间,默认等待30秒 | |
bool waitForDisconnected() | 等待断开socket连接,可设置等待时间,默认等待30秒 | |
QHostAddress localAddress() | 返回本socket的地址 | |
quint16 localPort() | 返回本socket的端口 | |
QHostAddress peerAdd |