生活随笔
收集整理的這篇文章主要介紹了
QT5实现简单的TCP通信
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用QT的網(wǎng)絡(luò)套接字需要.pro文件中加入一句:
[cpp]?view plaincopy
QT???????+=?network??
一、客戶端
1、客戶端的代碼比服務(wù)器稍簡單,總的來說,使用QT中的QTcpSocket類與服務(wù)器進(jìn)行通信只需要以下5步:
(1)創(chuàng)建QTcpSocket套接字對象
[cpp]?view plaincopy
socket?=?new?QTcpSocket();??
(2)使用這個對象連接服務(wù)器
[cpp]?view plaincopy
socket->connectToHost(IP,?port);??
(3)使用write函數(shù)向服務(wù)器發(fā)送數(shù)據(jù)
[cpp]?view plaincopy
socket->write(data);??
(4)當(dāng)socket接收緩沖區(qū)有新數(shù)據(jù)到來時,會發(fā)出readRead()信號,因此為該信號添加槽函數(shù)以讀取數(shù)據(jù)
[cpp]?view plaincopy
QObject::connect(socket,?&QTcpSocket::readyRead,?this,?&MainWindow::socket_Read_Data);?? ?? void?MainWindow::socket_Read_Data()?? {?? ????QByteArray?buffer;?? ?????? ????buffer?=?socket->readAll();?? }??
(5)斷開與服務(wù)器的連接(關(guān)于close()和disconnectFromHost()的區(qū)別,可以按F1看幫助)
[cpp]?view plaincopy
socket->disconnectFromHost();??
2、以下是客戶端的例程
首先是mainwindow.h文件:
[cpp]?view plaincopy
?? #ifndef?MAINWINDOW_H?? #define?MAINWINDOW_H?? ?? #include?<QMainWindow>?? #include?<QTcpSocket>?? ?? namespace?Ui?{?? class?MainWindow;?? }?? ?? class?MainWindow?:?public?QMainWindow?? {?? ????Q_OBJECT?? ?? public:?? ????explicit?MainWindow(QWidget?*parent?=?0);?? ????~MainWindow();?? ?? private?slots:?? ?? ????void?on_pushButton_Connect_clicked();?? ?? ????void?on_pushButton_Send_clicked();?? ?? ????void?socket_Read_Data();?? ?? ????void?socket_Disconnected();?? ?? private:?? ????Ui::MainWindow?*ui;?? ????QTcpSocket?*socket;?? };?? ?? #endif?//?MAINWINDOW_H??
然后是mainwindow.cpp文件:
[cpp]?view plaincopy
?? #include?"mainwindow.h"?? #include?"ui_mainwindow.h"?? ?? MainWindow::MainWindow(QWidget?*parent)?:?? ????QMainWindow(parent),?? ????ui(new?Ui::MainWindow)?? {?? ????ui->setupUi(this);?? ?? ????socket?=?new?QTcpSocket();?? ?? ?????? ????QObject::connect(socket,?&QTcpSocket::readyRead,?this,?&MainWindow::socket_Read_Data);?? ????QObject::connect(socket,?&QTcpSocket::disconnected,?this,?&MainWindow::socket_Disconnected);?? ?? ????ui->pushButton_Send->setEnabled(false);?? ????ui->lineEdit_IP->setText("127.0.0.1");?? ????ui->lineEdit_Port->setText("8765");?? ?? }?? ?? MainWindow::~MainWindow()?? {?? ????delete?this->socket;?? ????delete?ui;?? }?? ?? void?MainWindow::on_pushButton_Connect_clicked()?? {?? ????if(ui->pushButton_Connect->text()?==?tr("連接"))?? ????{?? ????????QString?IP;?? ????????int?port;?? ?? ?????????? ????????IP?=?ui->lineEdit_IP->text();?? ?????????? ????????port?=?ui->lineEdit_Port->text().toInt();?? ?? ?????????? ????????socket->abort();?? ?????????? ????????socket->connectToHost(IP,?port);?? ?? ?????????? ????????if(!socket->waitForConnected(30000))?? ????????{?? ????????????qDebug()?<<?"Connection?failed!";?? ????????????return;?? ????????}?? ????????qDebug()?<<?"Connect?successfully!";?? ?? ?????????? ????????ui->pushButton_Send->setEnabled(true);?? ?????????? ????????ui->pushButton_Connect->setText("斷開連接");?? ????}?? ????else?? ????{?? ?????????? ????????socket->disconnectFromHost();?? ?????????? ????????ui->pushButton_Connect->setText("連接");?? ????????ui->pushButton_Send->setEnabled(false);?? ????}?? }?? ?? void?MainWindow::on_pushButton_Send_clicked()?? {?? ????qDebug()?<<?"Send:?"?<<?ui->textEdit_Send->toPlainText();?? ??????? ????socket->write(ui->textEdit_Send->toPlainText().toLatin1());?? ????socket->flush();?? }?? ?? void?MainWindow::socket_Read_Data()?? {?? ????QByteArray?buffer;?? ?????? ????buffer?=?socket->readAll();?? ????if(!buffer.isEmpty())?? ????{?? ????????QString?str?=?ui->textEdit_Recv->toPlainText();?? ????????str+=tr(buffer);?? ?????????? ????????ui->textEdit_Recv->setText(str);?? ????}?? }?? ?? void?MainWindow::socket_Disconnected()?? {?? ?????? ????ui->pushButton_Send->setEnabled(false);?? ?????? ????ui->pushButton_Connect->setText("連接");?? ????qDebug()?<<?"Disconnected!";?? }??
最后是ui的設(shè)計:
二、服務(wù)器
1、服務(wù)器除了使用到了QTcpSocket類,還需要用到QTcpSever類。即便如此,也只是比客戶端復(fù)雜一點點,用到了6個步驟:
(1)創(chuàng)建QTcpSever對象
[cpp]?view plaincopy
server?=?new?QTcpServer();??
(2)偵聽一個端口,使得客戶端可以使用這個端口訪問服務(wù)器
[cpp]?view plaincopy
server->listen(QHostAddress::Any,?port)??
(3)當(dāng)服務(wù)器被客戶端訪問時,會發(fā)出newConnection()信號,因此為該信號添加槽函數(shù),并用一個QTcpSocket對象接受客戶端訪問
[cpp]?view plaincopy
connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);?? ?? void?MainWindow::server_New_Connect()?? {?? ?????? ????socket?=?server->nextPendingConnection();?? }??
(4)使用socket的write函數(shù)向客戶端發(fā)送數(shù)據(jù)
[cpp]?view plaincopy
socket->write(data);??
(5)當(dāng)socket接收緩沖區(qū)有新數(shù)據(jù)到來時,會發(fā)出readRead()信號,因此為該信號添加槽函數(shù)以讀取數(shù)據(jù)
[cpp]?view plaincopy
QObject::connect(socket,?&QTcpSocket::readyRead,?this,?&MainWindow::socket_Read_Data);?? ?? void?MainWindow::socket_Read_Data()?? {?? ????QByteArray?buffer;?? ?????? ????buffer?=?socket->readAll();?? }??
(6)取消偵聽
[cpp]?view plaincopy
server->close();??
2、以下是服務(wù)器的例程
首先是mainwindow.h文件:
[cpp]?view plaincopy
?? #ifndef?MAINWINDOW_H?? #define?MAINWINDOW_H?? ?? #include?<QMainWindow>?? #include?<QTcpServer>?? #include?<QTcpSocket>?? ?? namespace?Ui?{?? class?MainWindow;?? }?? ?? class?MainWindow?:?public?QMainWindow?? {?? ????Q_OBJECT?? ?? public:?? ????explicit?MainWindow(QWidget?*parent?=?0);?? ????~MainWindow();?? ?? private?slots:?? ????void?on_pushButton_Listen_clicked();?? ?? ????void?on_pushButton_Send_clicked();?? ?? ????void?server_New_Connect();?? ?? ????void?socket_Read_Data();?? ?? ????void?socket_Disconnected();?? ?? private:?? ????Ui::MainWindow?*ui;?? ????QTcpServer*?server;?? ????QTcpSocket*?socket;?? };?? ?? #endif?//?MAINWINDOW_H??
然后是mainwindow.cpp文件:
[cpp]?view plaincopy
#include?"mainwindow.h"?? #include?"ui_mainwindow.h"?? ?? MainWindow::MainWindow(QWidget?*parent)?:?? ????QMainWindow(parent),?? ????ui(new?Ui::MainWindow)?? {?? ????ui->setupUi(this);?? ?? ????ui->lineEdit_Port->setText("8765");?? ????ui->pushButton_Send->setEnabled(false);?? ?? ????server?=?new?QTcpServer();?? ?? ?????? ????connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);?? }?? ?? MainWindow::~MainWindow()?? {?? ????server->close();?? ????server->deleteLater();?? ????delete?ui;?? }?? ?? void?MainWindow::on_pushButton_Listen_clicked()?? {?? ????if(ui->pushButton_Listen->text()?==?tr("偵聽"))?? ????{?? ?????????? ????????int?port?=?ui->lineEdit_Port->text().toInt();?? ?? ?????????? ????????if(!server->listen(QHostAddress::Any,?port))?? ????????{?? ?????????????? ????????????qDebug()<<server->errorString();?? ????????????return;?? ????????}?? ?????????? ????????ui->pushButton_Listen->setText("取消偵聽");?? ????????qDebug()<<?"Listen?succeessfully!";?? ????}?? ????else?? ????{?? ?????????? ????????if(socket->state()?==?QAbstractSocket::ConnectedState)?? ????????{?? ?????????????? ????????????socket->disconnectFromHost();?? ????????}?? ?????????? ????????server->close();?? ?????????? ????????ui->pushButton_Listen->setText("偵聽");?? ?????????? ????????ui->pushButton_Send->setEnabled(false);?? ????}?? ?? }?? ?? void?MainWindow::on_pushButton_Send_clicked()?? {?? ????qDebug()?<<?"Send:?"?<<?ui->textEdit_Send->toPlainText();?? ?????? ????socket->write(ui->textEdit_Send->toPlainText().toLatin1());?? ????socket->flush();?? }?? ?? void?MainWindow::server_New_Connect()?? {?? ?????? ????socket?=?server->nextPendingConnection();?? ?????? ????QObject::connect(socket,?&QTcpSocket::readyRead,?this,?&MainWindow::socket_Read_Data);?? ????QObject::connect(socket,?&QTcpSocket::disconnected,?this,?&MainWindow::socket_Disconnected);?? ?????? ????ui->pushButton_Send->setEnabled(true);?? ?? ????qDebug()?<<?"A?Client?connect!";?? }?? ?? void?MainWindow::socket_Read_Data()?? {?? ????QByteArray?buffer;?? ?????? ????buffer?=?socket->readAll();?? ????if(!buffer.isEmpty())?? ????{?? ????????QString?str?=?ui->textEdit_Recv->toPlainText();?? ????????str+=tr(buffer);?? ?????????? ????????ui->textEdit_Recv->setText(str);?? ????}?? }?? ?? void?MainWindow::socket_Disconnected()?? {?? ?????? ????ui->pushButton_Send->setEnabled(false);?? ????qDebug()?<<?"Disconnected!";?? }??
最后是ui的設(shè)計:
三、運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的QT5实现简单的TCP通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。