基於Qt的TCP實現通信
本文實例為大傢分享瞭基於Qt的TCP實現通信的具體代碼,供大傢參考,具體內容如下
一、tcp介紹
TCP是面向連接的可靠傳輸的協議,協議規定通信的雙方是服務端和客戶端的兩個角色:
服務端:負責監聽網絡端口,等待客戶端的連接,用連接的socket完成信息的交互;
客戶端:負責每次連接的發起,建立連接後才可以進行通信;
二、界面設計
服務器端
客戶端
三、具體程序設計
(1)服務器端設計
1、建立一個工程,工程名為tcpserver,類名為server。在.pro文件中加入如下代碼並保存。
QT += network
2、進入server.h,添加類的前置聲明
class QTcpServer; //QTcpServer類的前置聲明 class QTcpSocket; //QTcpSocket類的前置聲明
添加私有對象指針
QTcpServer *tcpServer; //添加QTcpServer私有對象指針 QTcpSocket *socket; //添加QTcpSocket私有對象指針
添加私有槽聲明
void tcpServer_connect(); //連接函數 void read_data(); //讀取從client發來的信息 void disconnected(); //斷開連接 void on_sendButton_clicked(); //發送數據函數
3、轉到server.cpp文件中
添加頭文件#include,然後編寫構造函數構造函數
Server::Server(QWidget *parent) : //構造函數 QDialog(parent), ui(new Ui::Server) { ui->setupUi(this); tcpServer = new QTcpServer(this); //創建對象 if(!tcpServer->listen(QHostAddress::LocalHost,6666)) //調用listen監聽到來的連接,一旦有客戶端連接到服務器,就發射newConnection信號 { qDebug()<<tcpServer->errorString(); close(); } ui->sendButton->setEnabled(false); // 設置按鈕初始值值為false狀態,即不可用 connect(tcpServer,&QTcpServer::newConnection,this,&Server::tcpServer_connect);//將newConnection信號與槽函數連接起來 }
槽函數
//發送數據槽函數 void Server::on_sendButton_clicked() { socket->write(ui->sendText->toPlainText().toLocal8Bit()); //通過write函數發送數據 socket->flush(); ui->sendText->clear(); } //確認連接 void Server::tcpServer_connect() { socket=tcpServer->nextPendingConnection(); QObject::connect(socket,&QTcpSocket::readyRead,this,&Server::read_data); //當接收緩沖區有信號到來時,產生readyRead信號 QObject::connect(socket,&QTcpSocket::disconnected,this,&Server::disconnected);//當接收到dinconnected信號時,執行disconnected函數 ui->sendButton->setEnabled(true); //按鈕設置為有效 ui->label->setText(tr("連接成功!")); } //讀取客戶端發送的數據 void Server::read_data() { QByteArray buffer=socket->readAll(); //讀取的數據放入QByteArray對象中 ui->recText->append(QString::fromLocal8Bit(buffer)); //將數據顯示出來 } void Server::disconnected() { ui->sendButton->setEnabled(false); //斷開連接後按鈕值設置為無效 }
(2)客戶端設計
1、建立一個工程,工程名為tcpclient,類名為client。在.pro文件中加入如下代碼並保存。
QT += network
2、進入client.h,添加類的前置聲明
class QTcpSocket; //QTcpSocket類的前置聲明
定義一個套接字對象指針
QTcpSocket *tcpSocket; //定義一個套接字對象指針
添加私有槽函數聲明
void readData(); //讀取函數 void discon(); //斷開連接 void on_connectButton_clicked(); //連接按鈕槽函數 void on_sendButton_clicked(); //發送按鈕槽函數
3、轉到client.cpp,
添加頭文件#include,並編寫構造函數
Client::Client(QWidget *parent) : QDialog(parent), ui(new Ui::Client) { ui->setupUi(this); tcpSocket = new QTcpSocket(this); //定義套接字對象 //關聯信號到自定義的槽上 QObject::connect(tcpSocket,&QTcpSocket::readyRead,this,&Client::readData); //有接收數據時,執行讀函數 QObject::connect(tcpSocket,&QTcpSocket::disconnected,this,&Client::discon); ui->sendButton->setEnabled(false); }
槽函數
void Client::discon() { ui->sendButton->setEnabled(false); ui->connectButton->setText(tr("取消連接")); } //點擊連接按鈕,開始創建連接 void Client::on_connectButton_clicked() { if(ui->connectButton->text()==tr("連接")) { tcpSocket->abort(); tcpSocket->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());//連接到指定主機的端口 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); } } //點擊發送數據 void Client::on_sendButton_clicked() { QString sendData=ui->sendText->toPlainText(); //發送數據為文本框的的內容 tcpSocket->write(sendData.toLocal8Bit()); tcpSocket->flush(); ui->sendText->clear(); }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。