您好,登錄后才能下訂單哦!
這篇文章主要介紹了基于Qt的TCP怎么實現(xiàn)通信的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇基于Qt的TCP怎么實現(xiàn)通信文章都會有所收獲,下面我們一起來看看吧。
TCP是面向連接的可靠傳輸?shù)膮f(xié)議,協(xié)議規(guī)定通信的雙方是服務(wù)端和客戶端的兩個角色:
服務(wù)端:負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)端口,等待客戶端的連接,用連接的socket完成信息的交互;
客戶端:負(fù)責(zé)每次連接的發(fā)起,建立連接后才可以進(jìn)行通信;
客戶端
(1)服務(wù)器端設(shè)計
1、建立一個工程,工程名為tcpserver,類名為server。在.pro文件中加入如下代碼并保存。
QT += network
2、進(jìn)入server.h,添加類的前置聲明
class QTcpServer; //QTcpServer類的前置聲明 class QTcpSocket; //QTcpSocket類的前置聲明
添加私有對象指針
QTcpServer *tcpServer; //添加QTcpServer私有對象指針 QTcpSocket *socket; //添加QTcpSocket私有對象指針
添加私有槽聲明
void tcpServer_connect(); //連接函數(shù) void read_data(); //讀取從client發(fā)來的信息 void disconnected(); //斷開連接 void on_sendButton_clicked(); //發(fā)送數(shù)據(jù)函數(shù)
3、轉(zhuǎn)到server.cpp文件中
添加頭文件#include,然后編寫構(gòu)造函數(shù)構(gòu)造函數(shù)
Server::Server(QWidget *parent) : //構(gòu)造函數(shù) QDialog(parent), ui(new Ui::Server) { ui->setupUi(this); tcpServer = new QTcpServer(this); //創(chuàng)建對象 if(!tcpServer->listen(QHostAddress::LocalHost,6666)) //調(diào)用listen監(jiān)聽到來的連接,一旦有客戶端連接到服務(wù)器,就發(fā)射newConnection信號 { qDebug()<<tcpServer->errorString(); close(); } ui->sendButton->setEnabled(false); // 設(shè)置按鈕初始值值為false狀態(tài),即不可用 connect(tcpServer,&QTcpServer::newConnection,this,&Server::tcpServer_connect);//將newConnection信號與槽函數(shù)連接起來 }
槽函數(shù)
//發(fā)送數(shù)據(jù)槽函數(shù) void Server::on_sendButton_clicked() { socket->write(ui->sendText->toPlainText().toLocal8Bit()); //通過write函數(shù)發(fā)送數(shù)據(jù) socket->flush(); ui->sendText->clear(); } //確認(rèn)連接 void Server::tcpServer_connect() { socket=tcpServer->nextPendingConnection(); QObject::connect(socket,&QTcpSocket::readyRead,this,&Server::read_data); //當(dāng)接收緩沖區(qū)有信號到來時,產(chǎn)生readyRead信號 QObject::connect(socket,&QTcpSocket::disconnected,this,&Server::disconnected);//當(dāng)接收到dinconnected信號時,執(zhí)行disconnected函數(shù) ui->sendButton->setEnabled(true); //按鈕設(shè)置為有效 ui->label->setText(tr("連接成功!")); } //讀取客戶端發(fā)送的數(shù)據(jù) void Server::read_data() { QByteArray buffer=socket->readAll(); //讀取的數(shù)據(jù)放入QByteArray對象中 ui->recText->append(QString::fromLocal8Bit(buffer)); //將數(shù)據(jù)顯示出來 } void Server::disconnected() { ui->sendButton->setEnabled(false); //斷開連接后按鈕值設(shè)置為無效 }
(2)客戶端設(shè)計
1、建立一個工程,工程名為tcpclient,類名為client。在.pro文件中加入如下代碼并保存。
QT += network
2、進(jìn)入client.h,添加類的前置聲明
class QTcpSocket; //QTcpSocket類的前置聲明
定義一個套接字對象指針
QTcpSocket *tcpSocket; //定義一個套接字對象指針
添加私有槽函數(shù)聲明
void readData(); //讀取函數(shù) void discon(); //斷開連接 void on_connectButton_clicked(); //連接按鈕槽函數(shù) void on_sendButton_clicked(); //發(fā)送按鈕槽函數(shù)
3、轉(zhuǎn)到client.cpp,
添加頭文件#include,并編寫構(gòu)造函數(shù)
Client::Client(QWidget *parent) : QDialog(parent), ui(new Ui::Client) { ui->setupUi(this); tcpSocket = new QTcpSocket(this); //定義套接字對象 //關(guān)聯(lián)信號到自定義的槽上 QObject::connect(tcpSocket,&QTcpSocket::readyRead,this,&Client::readData); //有接收數(shù)據(jù)時,執(zhí)行讀函數(shù) QObject::connect(tcpSocket,&QTcpSocket::disconnected,this,&Client::discon); ui->sendButton->setEnabled(false); }
槽函數(shù)
void Client::discon() { ui->sendButton->setEnabled(false); ui->connectButton->setText(tr("取消連接")); } //點擊連接按鈕,開始創(chuàng)建連接 void Client::on_connectButton_clicked() { if(ui->connectButton->text()==tr("連接")) { tcpSocket->abort(); tcpSocket->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());//連接到指定主機(jī)的端口 if(!tcpSocket->waitForConnected(30000)) //超時連接失敗 { qDebug()<<"Connection failed!"; return; } qDebug()<<"Connection successfully!"; ui->connectButton->setText("取消連接"); ui->sendButton->setEnabled(true); } else { tcpSocket->disconnectFromHost(); ui->connectButton->setText("連接"); ui->sendButton->setEnabled(false); } } //點擊發(fā)送數(shù)據(jù) void Client::on_sendButton_clicked() { QString sendData=ui->sendText->toPlainText(); //發(fā)送數(shù)據(jù)為文本框的的內(nèi)容 tcpSocket->write(sendData.toLocal8Bit()); tcpSocket->flush(); ui->sendText->clear(); }
關(guān)于“基于Qt的TCP怎么實現(xiàn)通信”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“基于Qt的TCP怎么實現(xiàn)通信”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。