90 TCP通信概述

90.1 TCP协议

TCP(Transmission Control Protocol,传输控制协议)是一种被大多数互联网协议,如HTTP、FTP等,广泛采用的,有连接、可靠、面向数据流的传输层协议。它主要用于对传输可靠性要求较高的连续数据传输。与UDP协议不同,基于TCP协议的通信双方,需要建立持久的套接字连接,通过该连接发送数据无需要指定目的地址和端口。

90.2 QTcpServer和QTcpSocket

Qt提供QTcpServer和QTcpSocket两个类,用于建立TCP连接和基于该连接通信。服务器借助QTcpServer对象监听端口,等待并接受客户机的连接请求。连接建立后,客户机和服务器通过QTcpSocket对象收发数据。

90.2.1 QTcpServer

90.2.1.1 公有函数
90.2.1.2 信号函数
90.2.1.3 保护函数

90.2.2 QTcpSocket

90.2.2.1 公有函数
90.2.2.2 信号函数

90.2.3 服务器与客户机

服务器首先调用QTcpServer对象的listen方法,启动对指定IP地址和端口的监听。一旦客户机发起连接请求,该对象内部的incomingConnection方法即会创建一个用于与客户机通信的QTcpSocket对象,并发射newConnection信号。在与该信号相连接的槽函数中,调用QTcpServer对象的nextPendingConnection方法,获取QTcpSocket对象,与客户机通信。QTcpSocket类提供了基于TCP协议的通信接口。在此基础上,可以实现诸如POP3、SMTP、NNTP等标准网络协议,甚至可以实现自己定义的网络协议。

客户机首先通过QTcpSocket对象的connectToHost方法连接服务器,这里需要提供服务器的IP地址和端口。connectToHost方法不会阻塞程序运行,连接成功后会发射connected信号。如果需要以阻塞方式连接服务器,可以使用waitForConnected方法,该函数会阻塞程序运行,直到连接成功或失败时才返回。如果连接服务器成功,客户机、服务器双方就可以向写缓冲区写入数据或者从读缓冲区读取数据,实现数据通信。当读缓冲区有新数据进入时,会发射readyRead信号,在与该信号相连接的槽函数中读取缓冲区中的数据。一个QTcpSocket对象可以同时接收和发送数据,两个过程是异步执行的,且各自拥有独立的缓冲区。