- TCP是一种被大多数Internet网络协议(如HTTP和FTP)用于数据传输的低级网络协议,它是可靠的、面向流、面向连接的传输层协议,特别适用于连续数据传输。
- TCP通信必须先建立TCP连接,通信端分为客户端和服务器端。
- Qt提供QTcpSocket类和QTcpServer类用于建立TCP通信应用程序。
- 服务器端程序必须使用QTcpServer用于端口监听,建立服务器;QTcpSocket用于建立连接够使用套接字(Socket)进行通信
- QTcpServer是从QObject继承的类,它主要用于服务器端建立网络监听,创建网络Socket连接。
QTcpServer类
- 公有函数
--void close()
--bool listen()
--bool isListening()
--QTcpSocket* nextPendingConnection()//返回下一个等待接入的连接
--QHostAddress serverAddress()
--quint16 serverPort()
--bool waitForNewConnection()//以阻塞方式等待新连接
- 信号
--void acceptError(QAbstractSocket::SocketError socketError)
--void newConnection()
- 保护函数
--void addPendingConnection(QTcpSocket *socket)
--virtual void incomingConnection(qintptr socketDescriptor)
1. QTcpServer
1) 开始监听
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
启动监听
2) 当监听到新客户端接入时,QTcpServer会调用函数 incomingConnection
void incomingConnection(qintptr socketDescriptor)
{
创建QTcpSocket对象
调用函数addPendingConnection(),将QTcpSocket对象添加到一个内部的套接字列表中
发射信号 newConnection ()
}
3)处理newConnection()信号(定义槽函数)
void onNewConnection(){
调用函数nextPendingConnection(),获取一个套接字
使用该套接字和对应的客户端进行通信
}
QTcpSocket类
- QTcpSocket类从QAbstractSocket继承而来。除了构造函数和析构函数,其他函数由基类提供的。QAbstractSocket用于TCP通信的主要接口函数如下:
- 公有函数
--void connectToHost(QHostAddress &address,quint16 port)
--void disconnectFromHost()
--bool waitForConnected()
--bool waitForDisconnected()
--QHostAddress localAddress()
--quint16 localPort()
--QHostAddress peerAddress()
--QString peerName()
--quint16 peerPort()
--qint64 readBufferSize()
--void setReadBufferSize(qint64 size)
--qint64 betysAvailable()
--bool canReadLine()
--QAbstractSocket::SocketState state()
- 信号
--void connected():connectToHost()成功连接到服务器后发射此信号
--void disconnected():当socket断开连接后发射此信号
--void error(QAbstractSocket::SocketError,socketError):当socket发生错误时发射此信号
--void hostFound():调用connectToHost()找到主机后发射此信号
--void stateChanged(QAbstractSocket::SocketState socketState):
当socket的状态变化时发射此信号,参数socketState表示了socket当前的状态
--void readyRead():
当缓冲区有新数据需要读取时发射此信号,在此信号的槽函数里,读取缓冲区的数据
2. QTcpSocket
1) 开始连接
void connectToHost(const QHostAddress &address, quint16 port, QIODevice::OpenMode openMode = ReadWrite)
{
①. Socket在给定的openMode中打开
②. 进入HostLookupState状态
③. 执行 address 主机查找
④. 如果查找成功,发射信号hostFound(),同时状态进入 ConnectingState状态
⑤. 尝试连接到查找到的一个或多个地址
⑥. 如果连接成功,状态进入ConnectedState状态,同时发射信号connected()。
总结:先进行主机查找,然后尝试连接,如果连接成功,会发射信号connected()信号
}
2) 断开连接
void disconnectFromHost()
{
①. 尝试关闭连接
②. 如果有待写入数据正在等待写入,进入ClosingState状态,等待,直到所有数据写入完毕.
③. 最后,进入UnconnectedState状态,发射信号 disconnected()。
}