客戶(hù)端和服務(wù)器端建立通信過(guò)程
使用Qt提供的類(lèi)進(jìn)行基于TCP
的套接字通信需要用到兩個(gè)類(lèi):
QTcpServer:服務(wù)器類(lèi),用于監(jiān)聽(tīng)客戶(hù)端連接以及和客戶(hù)端建立連接。
QTcpSocket:通信的套接字類(lèi),客戶(hù)端、服務(wù)器端都需要使用。
服務(wù)器端QTcpServer
QTcpServer
類(lèi)用于監(jiān)聽(tīng)客戶(hù)端連接以及和客戶(hù)端建立連接,在使用之前先介紹一下這個(gè)類(lèi)提供的一些常用API函數(shù):
公共成員函數(shù)
構(gòu)造函數(shù)
QTcpServer::QTcpServer(QObject *parent = nullptr)
給監(jiān)聽(tīng)的套接字設(shè)置監(jiān)聽(tīng)listen()
函數(shù)
bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
在代碼中通過(guò)啟動(dòng)監(jiān)聽(tīng)按鈕
設(shè)置監(jiān)聽(tīng)
//啟動(dòng)監(jiān)聽(tīng)服務(wù)
void MainWindow::on_setListen_released()
{
unsigned short port =ui->port->text().toUShort();
m_server->listen(QHostAddress::Any,port);
ui->setListen->setDisabled(true);//
}
參數(shù):
-
address:通過(guò)類(lèi)
QHostAddress
可以封裝IPv4
、IPv6
格式的IP地址,QHostAddress::Any
表示自動(dòng)綁定。 -
port:如果指定為0表示隨機(jī)綁定一個(gè)可用端口。 返回值:綁定成功返回
true
,失敗返回false
。
判斷當(dāng)前對(duì)象是否在監(jiān)聽(tīng), 是返回true,沒(méi)有監(jiān)聽(tīng)返回false
bool QTcpServer::isListening() const;
如果當(dāng)前對(duì)象正在監(jiān)聽(tīng),返回監(jiān)聽(tīng)的服務(wù)器地址信息, 否則返回 QHostAddress::Null
QHostAddress QTcpServer::serverAddress() const;
如果服務(wù)器正在偵聽(tīng)連接,則返回服務(wù)器的端口; 否則返回0
quint16 QTcpServer::serverPort() const
服務(wù)器端QTcpSocket
QTcpSocket
是一個(gè)套接字通信類(lèi),不管是客戶(hù)端還是服務(wù)器端都需要使用。在Qt
中發(fā)送和接收數(shù)據(jù)也屬于IO操作(網(wǎng)絡(luò)IO),先來(lái)看一下這個(gè)類(lèi)的繼承關(guān)系:
得到和客戶(hù)端建立連接之后用于通信的QTcpSocket
套接字對(duì)象,它是QTcpServer
的一個(gè)子對(duì)象,當(dāng)QTcpServer
對(duì)象析構(gòu)的時(shí)候會(huì)自動(dòng)析構(gòu)這個(gè)子對(duì)象,當(dāng)然也可自己手動(dòng)析構(gòu),建議用完之后自己手動(dòng)析構(gòu)這個(gè)通信的QTcpSocket
對(duì)象。
QTcpSocket *QTcpServer::nextPendingConnection();
阻塞等待客戶(hù)端發(fā)起的連接請(qǐng)求,不推薦在單線(xiàn)程程序中使用waitForNewConnection()
,建議使用非阻塞方式處理新連接,即使用信號(hào) newConnection()
。
bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR);
參數(shù):
-
msec
:指定阻塞的最大時(shí)長(zhǎng),單位為毫秒(ms
); -
timeout
:傳出參數(shù),如果操作超時(shí)timeout
為true
,沒(méi)有超時(shí)timeout
為false
。
套接字通信的過(guò)程中的信號(hào)
1.在使用QTcpSocket
進(jìn)行套接字通信的過(guò)程中,如果該類(lèi)對(duì)象發(fā)射出readyRead()
信號(hào),說(shuō)明對(duì)端發(fā)送的數(shù)據(jù)達(dá)到了,之后就可以調(diào)用 readAll ()
函數(shù)接收數(shù)據(jù)了。
[signal] void QIODevice::readyRead();
官方解釋
This signal is emitted once every time new data is available for reading from the device's current read channel. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device
2.調(diào)用connectToHost()
函數(shù)并成功建立連接之后發(fā)出connected()
信號(hào)。
[signal] void QAbstractSocket::connected();
3.在套接字?jǐn)嚅_(kāi)連接時(shí)發(fā)出disconnected()信號(hào)。
[signal] void QAbstractSocket::disconnected();
接收數(shù)據(jù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-731945.html
// 指定可接收的最大字節(jié)數(shù) maxSize 的數(shù)據(jù)到指針 data 指向的內(nèi)存中
qint64 QIODevice::read(char *data, qint64 maxSize);
// 指定可接收的最大字節(jié)數(shù) maxSize,返回接收的字符串
QByteArray QIODevice::read(qint64 maxSize);
// 將當(dāng)前可用操作數(shù)據(jù)全部讀出,通過(guò)返回值返回讀出的字符串
QByteArray QIODevice::readAll();
發(fā)送數(shù)據(jù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-731945.html
// 發(fā)送指針 data 指向的內(nèi)存中的 maxSize 個(gè)字節(jié)的數(shù)據(jù)
qint64 QIODevice::write(const char *data, qint64 maxSize);
// 發(fā)送指針 data 指向的內(nèi)存中的數(shù)據(jù),字符串以 \0 作為結(jié)束標(biāo)記
qint64 QIODevice::write(const char *data);
// 發(fā)送參數(shù)指定的字符串
qint64 QIODevice::write(const QByteArray &byteArray);
到了這里,關(guān)于TCP/IP客戶(hù)端和服務(wù)器端建立通信過(guò)程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!