概要:本期主要講解QT中對于TCP協(xié)議通信的實現(xiàn)。
一、TCP協(xié)議
傳輸控制協(xié)議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793 定義。
TCP建立連接前,需要進(jìn)行三次握手,如下圖所示:
TCP斷開連接前,需要進(jìn)行四次揮手,如下圖所示:
二、Qt中TCP協(xié)議處理
Qt中提供了QTcpSocket類和QTcpServer類分別用于創(chuàng)建TCP套接字和TCP服務(wù)器套接字。
1.QTcpSocket
QTcpSocket類繼承與QAbstractSocket,主要提供了socket套接字的創(chuàng)建、綁定端口、連接服務(wù)器等。
2.QTcpServer
QTcpServer類繼承于QSctpServer,主要提供了對于TCP連接信號的響應(yīng)和監(jiān)聽等。
三、Qt實現(xiàn)TCP通信
1.客戶端
客戶端是發(fā)送端,主要實現(xiàn)與服務(wù)器端建立連接、發(fā)送數(shù)據(jù)。步驟如下:建立TCP套接字 --> 連接服務(wù)器 --> 發(fā)送數(shù)據(jù)
下面是客戶端的源碼:
#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QObject>
#include <QTcpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QTimer>
class TCPClient : QObject
{
Q_OBJECT
public:
TCPClient();
void InitSocket();//初始化Socket套接字
void InitTimer();//初始化定時器,定時發(fā)送
void ConnectToServer();//連接服務(wù)器
void SendData();//發(fā)送數(shù)據(jù)
private:
QTcpSocket *mTcpSocket;//Tcp連接套接字
QHostAddress mServerAddress;//服務(wù)器IP
QTimer *mTimer;//定時器對象
};
#endif // TCPCLIENT_H
#include "tcpclient.h"
TCPClient::TCPClient()
{
InitSocket();
ConnectToServer();
InitTimer();
}
void TCPClient::InitSocket()
{
mTcpSocket = new QTcpSocket;//初始化Tcp連接套接字
mServerAddress.setAddress("10.0.0.177");//設(shè)置服務(wù)器地址
}
void TCPClient::InitTimer()
{
mTimer = new QTimer;//初始化定時器對象
connect(mTimer,&QTimer::timeout,this,[=]
{
SendData();
});
mTimer->start(1000);//每隔一秒發(fā)送一次數(shù)據(jù)
}
void TCPClient::ConnectToServer()
{
quint16 _port = 7777;//設(shè)置服務(wù)器端口
connect(mTcpSocket,&QTcpSocket::connected,this,[=]{
qDebug()<< "Connect To Server Successful!"<<endl;
});
mTcpSocket->connectToHost(mServerAddress,_port,QIODevice::WriteOnly);//連接服務(wù)器
}
void TCPClient::SendData()
{
QByteArray _data = "hello";
if(-1 != mTcpSocket->write(_data.data(),_data.length()))
{
qDebug()<< "TCP ==> Send data : "<< _data<<endl;
}
mTcpSocket->flush();
}
2.服務(wù)器端
服務(wù)器端是接收端,主要實現(xiàn)監(jiān)聽連接信號,建立連接和接收數(shù)據(jù)。步驟如下:建立監(jiān)聽套接字 --> 連接到客戶端 --> 獲得連接套接字 --> 接收數(shù)據(jù)
下面是服務(wù)器端源碼:文章來源:http://www.zghlxwxcb.cn/news/detail-595452.html
#ifndef TCPSEVER_H
#define TCPSEVER_H
#include <QObject>
#include <QHostAddress>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
class TCPSever : QObject
{
Q_OBJECT
public:
TCPSever();
void InitServer();//初始化服務(wù)器
private:
QTcpServer *mTcpServer;//服務(wù)器對象
QTcpSocket *mTcpSocket;//客戶端套接字
QHostAddress mHostAddress;//本地IP地址
};
#endif // TCPSEVER_H
#include "tcpsever.h"
TCPSever::TCPSever()
{
InitServer();
}
void TCPSever::InitServer()
{
mTcpServer = new QTcpServer(this);//初始化監(jiān)聽套接字
mTcpSocket = new QTcpSocket;//初始化連接套接字
mHostAddress.setAddress("10.0.0.177");//設(shè)置監(jiān)聽網(wǎng)卡IP
quint16 _port = 7777;//設(shè)置監(jiān)聽端口
mTcpServer->listen(mHostAddress,_port);//監(jiān)聽指定網(wǎng)卡和端口
qDebug()<<"Listen Interface ["<<mHostAddress.toString()<<"] And Port ["<<_port<<"] Successful!"<<endl;
connect(mTcpServer,&QTcpServer::newConnection,this,[=]{
mTcpSocket = mTcpServer->nextPendingConnection();//獲取連接套接字
qDebug()<<"Connect To Client Successful!"<<endl;
connect(mTcpSocket,&QTcpSocket::readyRead,this,[=]{//讀取消息
QByteArray _data = mTcpSocket->readAll();
qDebug()<<"TCP Receive Data : "<<QString::fromLatin1(_data)<<endl;
});
});
}
結(jié)尾
以上就是QT中TCP通信模塊的全部內(nèi)容,然后上面的源碼可以直接編,但是記得去PRO文件中加入network模塊:)文章來源地址http://www.zghlxwxcb.cn/news/detail-595452.html
到了這里,關(guān)于【Qt網(wǎng)絡(luò)編程】實現(xiàn)TCP協(xié)議通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!