日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT5实现简单的TCP通信

發布時間:2025/3/21 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT5实现简单的TCP通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用QT的網絡套接字需要.pro文件中加入一句:

[cpp]?view plaincopy
  • QT???????+=?network??

  • 一、客戶端

    1、客戶端的代碼比服務器稍簡單,總的來說,使用QT中的QTcpSocket類與服務器進行通信只需要以下5步:

    (1)創建QTcpSocket套接字對象

    [cpp]?view plaincopy
  • socket?=?new?QTcpSocket();??

  • (2)使用這個對象連接服務器

    [cpp]?view plaincopy
  • socket->connectToHost(IP,?port);??

  • (3)使用write函數向服務器發送數據

    [cpp]?view plaincopy
  • socket->write(data);??

  • (4)當socket接收緩沖區有新數據到來時,會發出readRead()信號,因此為該信號添加槽函數以讀取數據

    [cpp]?view plaincopy
  • QObject::connect(socket,?&QTcpSocket::readyRead,?this,?&MainWindow::socket_Read_Data);??
  • ??
  • void?MainWindow::socket_Read_Data()??
  • {??
  • ????QByteArray?buffer;??
  • ????//讀取緩沖區數據??
  • ????buffer?=?socket->readAll();??
  • }??

  • (5)斷開與服務器的連接(關于close()和disconnectFromHost()的區別,可以按F1看幫助)

    [cpp]?view plaincopy
  • socket->disconnectFromHost();??

  • 2、以下是客戶端的例程

    首先是mainwindow.h文件:

    [cpp]?view plaincopy
  • //mainwindow.h??
  • #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
  • //mainwindow.cpp??
  • #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地址??
  • ????????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();??
  • ?????//獲取文本框內容并以ASCII碼形式發送??
  • ????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的設計:



    二、服務器

    1、服務器除了使用到了QTcpSocket類,還需要用到QTcpSever類。即便如此,也只是比客戶端復雜一點點,用到了6個步驟:

    (1)創建QTcpSever對象

    [cpp]?view plaincopy
  • server?=?new?QTcpServer();??

  • (2)偵聽一個端口,使得客戶端可以使用這個端口訪問服務器

    [cpp]?view plaincopy
  • server->listen(QHostAddress::Any,?port)??

  • (3)當服務器被客戶端訪問時,會發出newConnection()信號,因此為該信號添加槽函數,并用一個QTcpSocket對象接受客戶端訪問

    [cpp]?view plaincopy
  • connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);??
  • ??
  • void?MainWindow::server_New_Connect()??
  • {??
  • ????//獲取客戶端連接??
  • ????socket?=?server->nextPendingConnection();??
  • }??

  • (4)使用socket的write函數向客戶端發送數據

    [cpp]?view plaincopy
  • socket->write(data);??

  • (5)當socket接收緩沖區有新數據到來時,會發出readRead()信號,因此為該信號添加槽函數以讀取數據

    [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、以下是服務器的例程

    首先是mainwindow.h文件:

    [cpp]?view plaincopy
  • //mainwindow.h??
  • #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();??
  • ????//獲取文本框內容并以ASCII碼形式發送??
  • ????socket->write(ui->textEdit_Send->toPlainText().toLatin1());??
  • ????socket->flush();??
  • }??
  • ??
  • void?MainWindow::server_New_Connect()??
  • {??
  • ????//獲取客戶端連接??
  • ????socket?=?server->nextPendingConnection();??
  • ????//連接QTcpSocket的信號槽,以讀取新數據??
  • ????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的設計:



    三、運行結果



    總結

    以上是生活随笔為你收集整理的QT5实现简单的TCP通信的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。