基于Qt的TCP實(shí)現(xiàn)通信
本文實(shí)例為大家分享了基于Qt的TCP實(shí)現(xiàn)通信的具體代碼,供大家參考,具體內(nèi)容如下
一、tcp介紹
TCP是面向連接的可靠傳輸?shù)膮f(xié)議,協(xié)議規(guī)定通信的雙方是服務(wù)端和客戶端的兩個(gè)角色:
服務(wù)端:負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)端口,等待客戶端的連接,用連接的socket完成信息的交互;
客戶端:負(fù)責(zé)每次連接的發(fā)起,建立連接后才可以進(jìn)行通信;
二、界面設(shè)計(jì)
服務(wù)器端

客戶端

三、具體程序設(shè)計(jì)
(1)服務(wù)器端設(shè)計(jì)
1、建立一個(gè)工程,工程名為tcpserver,類名為server。在.pro文件中加入如下代碼并保存。
QT ? ? ? += network
2、進(jìn)入server.h,添加類的前置聲明
class QTcpServer; //QTcpServer類的前置聲明 class QTcpSocket; ? //QTcpSocket類的前置聲明
添加私有對(duì)象指針
QTcpServer *tcpServer; ? ? ? ? ?//添加QTcpServer私有對(duì)象指針 QTcpSocket *socket; ? ? ? ? ? ? //添加QTcpSocket私有對(duì)象指針
添加私有槽聲明
?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)建對(duì)象
? ? if(!tcpServer->listen(QHostAddress::LocalHost,6666)) ? ? ? ? ? ? ? ? ? ? ? ? ?//調(diào)用listen監(jiān)聽到來的連接,一旦有客戶端連接到服務(wù)器,就發(fā)射newConnection信號(hào)
? ? {
? ? ? ? qDebug()<<tcpServer->errorString();
? ? ? ? close();
? ? }
? ? ui->sendButton->setEnabled(false); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 設(shè)置按鈕初始值值為false狀態(tài),即不可用
? ? connect(tcpServer,&QTcpServer::newConnection,this,&Server::tcpServer_connect);//將newConnection信號(hào)與槽函數(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ū)有信號(hào)到來時(shí),產(chǎn)生readyRead信號(hào)
? ? QObject::connect(socket,&QTcpSocket::disconnected,this,&Server::disconnected);//當(dāng)接收到dinconnected信號(hào)時(shí),執(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對(duì)象中
? ? ui->recText->append(QString::fromLocal8Bit(buffer)); ? ? ??//將數(shù)據(jù)顯示出來
}
void Server::disconnected()
{
? ? ui->sendButton->setEnabled(false); ? ? ? ?//斷開連接后按鈕值設(shè)置為無效
}(2)客戶端設(shè)計(jì)
1、建立一個(gè)工程,工程名為tcpclient,類名為client。在.pro文件中加入如下代碼并保存。
QT ? ? ? += network
2、進(jìn)入client.h,添加類的前置聲明
class QTcpSocket; ? ? //QTcpSocket類的前置聲明
定義一個(gè)套接字對(duì)象指針
QTcpSocket *tcpSocket;? ? ? ?//定義一個(gè)套接字對(duì)象指針
添加私有槽函數(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);? ? ? ? ? //定義套接字對(duì)象
? ? //關(guān)聯(lián)信號(hào)到自定義的槽上
? ? QObject::connect(tcpSocket,&QTcpSocket::readyRead,this,&Client::readData); ? ? ? ? ?//有接收數(shù)據(jù)時(shí),執(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("取消連接"));
}
//點(diǎn)擊連接按鈕,開始創(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)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //超時(shí)連接失敗
? ? ? ? {
? ? ? ? ? ? qDebug()<<"Connection failed!";
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? qDebug()<<"Connection successfully!";
? ? ? ? ui->connectButton->setText("取消連接");
? ? ? ? ui->sendButton->setEnabled(true);
? ? }
? ? else
? ? {
? ? ? ? tcpSocket->disconnectFromHost();
? ? ? ? ui->connectButton->setText("連接");
? ? ? ? ui->sendButton->setEnabled(false);
? ? }
}
//點(diǎn)擊發(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();
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例
- QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn)
- 基于QT的TCP通信服務(wù)的實(shí)現(xiàn)
- Qt中TCP協(xié)議通信詳解
- QT編寫tcp通信工具(Client篇)
- Qt網(wǎng)絡(luò)編程實(shí)現(xiàn)TCP通信
- Qt網(wǎng)絡(luò)編程之TCP通信及常見問題
- QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解
- QT實(shí)現(xiàn)簡(jiǎn)單TCP通信
- QT TCP實(shí)現(xiàn)簡(jiǎn)單的通信示例
相關(guān)文章
C++ TensorflowLite模型驗(yàn)證的過程詳解
這篇文章給大家介紹了C++ TensorflowLite模型驗(yàn)證的過程,測(cè)試代碼,主要是RunInference()和read_file(),詳細(xì)操作過程跟隨小編一起看看吧2021-08-08
C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建的相關(guān)資料,希望通過本文幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解
這篇文章主要介紹了C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
c/c++獲取系統(tǒng)時(shí)間函數(shù)的方法示例
這篇文章主要介紹了c/c++獲取系統(tǒng)時(shí)間函數(shù)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C語(yǔ)言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)
qsort函數(shù)是由C語(yǔ)言提供的標(biāo)準(zhǔn)庫(kù)函數(shù), 它的實(shí)現(xiàn)思想是快速排序。這篇文章主要介紹了C語(yǔ)言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)qsort函數(shù)功能,需要的可以參考一下2022-10-10
C++中std::invalid_argument報(bào)錯(cuò)解決
在C++編程中,std::invalid_argument是一個(gè)常見的異常,用于指示函數(shù)參數(shù)無效,文章詳細(xì)解析了這一異常的產(chǎn)生原因,并提供了多種解決策略,感興趣的可以了解一下2024-09-09
C語(yǔ)言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出
上期我們講完了排序算法下,不知道小伙伴們有沒有發(fā)現(xiàn)一個(gè)問題,快速排序和歸并排序我們都是用遞歸來實(shí)現(xiàn)的,可能有小伙伴會(huì)問,如果說數(shù)據(jù)量很多話,棧區(qū)空間會(huì)不會(huì)不夠用呢?這期我們就來解決使用遞歸實(shí)現(xiàn)的排序?qū)е聴R绯鋈绾谓鉀Q2022-04-04
C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配
C++ 不允許變量重名,但是允許多個(gè)函數(shù)取相同的名字,只要參數(shù)表不同即可,這叫作函數(shù)的重載,下面這篇文章主要給大家介紹了關(guān)于C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配的相關(guān)資料,需要的朋友可以參考下2019-01-01
C語(yǔ)言多功能動(dòng)態(tài)通訊錄實(shí)現(xiàn)示例
這篇文章主要為大家介紹了C語(yǔ)言多功能動(dòng)態(tài)通訊錄實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

