qt TCP 网络编程
qt 網絡
介紹 待補
QT網絡編程——TCP服務器和客戶端通信
Qt網絡編程(1):QTcpSocket和QTcpServer的基本使用
介紹得非常清楚
客戶端
有兩種方式:
先說第一種
QTcpSocket 成員變量
首先 QTcpSocket 最基本的功能
1、創建QTcpSocket對象,并用connectToHost()函數通過IP和端口號連接服務器。
2、客戶端成功連接上服務器,系統會產生connected信號。(所以需要將信號和槽函數進行綁定)
connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_slot())); //客戶端連接服務器成功后會產生connected信號3、客戶端收到服務器發送來的數據,會產生readyRead信號,在connected信號對應的槽函數中,將readyRead信號和對應的槽函數進行綁定。
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot())); //和服務器連接成功后,就需要就收服務器發送過來的數據了,4、通過套接字對象讀取服務器發來的數據。(用readall()等函數)
tcpSocket->readAll(); //從套接字中讀取服務器發來的數據5、通過套接字向服務器發送數據。(用write()函數)
tcpSocket->write(text); //向服務器發送數據6、服務器斷開連接,會發送disconnected信號
connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));這里要做的稍微復雜一點
頭文件
連接服務器
要保持一直連接的狀態
要考慮到:連不上自動重連;掉線自動重連的功能
這里用定時器實現以上功能
連接服務器 Connect時開一個定時器 m_timerConnect。
在構造函數里:
- 定時器槽函數
- QTcpSocket 連接上的槽函數
- QTcpSocket 斷開的槽函數
連服務器:
先關閉套接字
abort 調用了 close, close 調用了 disconnectFromHost。 abort 立即關閉套接字,并丟棄寫緩沖區中的所有待處理數據。close 關閉套接字的 IO,以及套接字的連接。
再連接服務器connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite);
開啟定時器
void Client::Connect(QString strServerIP, int nServerPort) {m_strServerIP = strServerIP;m_nServerPort = nServerPort;m_bCloseConnect = false;// m_pTcpSocket->abort();m_pTcpSocket->connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite);m_timerConnect.start(3000); }如果服務器連上了
關閉定時器,狀態設置為已連接
//connect(m_pTcpSocket, SIGNAL(connected()), this, SLOT(OnConnected())); void Client::OnConnected() {m_bConnected = true;m_timerConnect.stop(); }如果沒連上
//到時間沒有連上,觸發定時器connect(&m_timerConnect, SIGNAL(timeout()), this, SLOT(OnTimerReconncet())); void Client::OnTimerReconncet() {m_pTcpSocket->abort();m_pTcpSocket->connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite); }如果服務器斷開了
開啟定時器
void CTcpClient::OnDisconnected() {m_bConnected = false;m_timerReconnect.start(); }發送的數據
向服務器發送消息調用
qint64 write(const char *data, qint64 len);qint64 write(const char *data);bool SendData(QString strData);
{
AddDataToSendQueue(strData);
}
AddDataToSendQueue
m_lock.lock();
m_quueSendData.enqueue(strData);
m_lock.unlock();
發送一個數據,開啟時間循環。等待服務器返回消息。再返回結果
接收數據
總結
以上是生活随笔為你收集整理的qt TCP 网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(3090):vue+eleme
- 下一篇: Dropbox - share your