91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt怎么實現簡單的TCP通信

發布時間:2022-08-25 15:32:58 來源:億速云 閱讀:188 作者:iii 欄目:開發技術

本篇內容介紹了“Qt怎么實現簡單的TCP通信”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

QT += network

一、客戶端

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

(1)創建QTcpSocket套接字對象

socket = new QTcpSocket();

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

socket->connectToHost(IP, port);

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

socket->write(data);

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

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

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

socket->disconnectFromHost();

2、以下是客戶端的例程

首先是mainwindow.h文件:

 //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文件:

//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的設計:

Qt怎么實現簡單的TCP通信

二、服務器

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

(1)創建QTcpSever對象

server = new QTcpServer();

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

server->listen(QHostAddress::Any, port);

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

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

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

socket->write(data);

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

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

(6)取消偵聽

server->close();

2、以下是服務器的例程

首先是mainwindow.h文件:

//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文件:

#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
     {
 /*
         //如果正在連接(點擊偵聽后立即取消偵聽,若socket沒有指定對象會有異常,應修正——2017.9.30)
         if(socket->state() == QAbstractSocket::ConnectedState)
         {
             //關閉連接
             socket->disconnectFromHost();
         }
 */
         socket->abort();
         //取消偵聽
         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的設計:

Qt怎么實現簡單的TCP通信

三、運行結果

Qt怎么實現簡單的TCP通信

“Qt怎么實現簡單的TCP通信”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宾川县| 武强县| 北碚区| 通江县| 班玛县| 黄大仙区| 津南区| 海淀区| 望谟县| 宁德市| 麻江县| 贵州省| 平南县| 临海市| 华蓥市| 平遥县| 四川省| 北辰区| 四子王旗| 莱西市| 兴义市| 宝兴县| 临潭县| 五家渠市| 霍邱县| 巴东县| 铜山县| 徐水县| 荥经县| 滨海县| 新和县| 南澳县| 克什克腾旗| 连南| 荥阳市| 廊坊市| 江达县| 常德市| 板桥市| 昌宁县| 乳源|