Qt實現tcp通信(QTcpServer和QTcpSocket的應用)詳細教程
服務端
-
監聽地址和端口
ip可以是Ipv4Any,本機地址,也可以是固定的某個ip
端口號則作為服務端綁定的端口,客戶端連接服務端時需要連接到服務端綁定的端口,端口不對連接失敗m_server=new QTcpServer(this); m_server->listen(QHostAddress::AnyIPv4,serverPort);
-
監聽連接
監聽連接信號,當有新連接到來時會觸發,可以通過nextPendingConnection()接口獲取新連接來的QTcpSocket,后續通過此QTcpSocket和對應的客戶端收發消息connect(m_server,&QTcpServer::newConnection,[this](){if(m_server->hasPendingConnections()){m_socket=m_server->nextPendingConnection();} });
-
讀寫數據
connect(m_socket,&QTcpSocket::readyRead,[this](){auto data=m_socket->readAll();}); m_socket->write(data);//發送數據 m_socket->flush();//可以使數據立即發送出去,無需等其他方面的調度
客戶端
-
連接服務端
auto socket=new QTcpSocket(this); socket->connectToHost(serverIp,serverPort); if (socket->waitForConnected(3000)) { // 最多等待 3 秒qDebug() << "Connected to server!"; } else {qWarning() << "Connection failed:" << socket->errorString(); }
-
讀寫數據用法同上
connect(m_socket,&QTcpSocket::readyRead,[this](){auto data=m_socket->readAll();}); m_socket->write(data);//發送數據 m_socket->flush();//可以使數據立即發送出去,無需等其他方面的調度
注意點
QTcpSocket發送的數據如果不及時讀取的話,數據會堆疊在一起,下次接收時可能讀取的是多次發送的數據,因此需要注意設置一些分割標識,便于堆疊數據的拆分。