亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt實現(xiàn)簡單的TCP通信

 更新時間:2022年08月19日 17:06:38   作者:小劉同學++  
這篇文章主要為大家詳細介紹了Qt實現(xiàn)簡單的TCP通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

這段時間用到了QT的TCP通信,做了初步的學習與嘗試,編寫了一個客戶端和服務(wù)器基于窗口通信的小例程。

使用QT的網(wǎng)絡(luò)套接字需要.pro文件中加入一句:

QT += network

一、客戶端

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

(1)創(chuàng)建QTcpSocket套接字對象

socket = new QTcpSocket();

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

socket->connectToHost(IP, port);

(3)使用write函數(shù)向服務(wù)器發(fā)送數(shù)據(jù)

socket->write(data);

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

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

(5)斷開與服務(wù)器的連接(關(guān)于close()和disconnectFromHost()的區(qū)別,可以按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();
? ? ? ? ?//連接服務(wù)器
? ? ? ? ?socket->connectToHost(IP, port);
??
? ? ? ? ?//等待連接成功
? ? ? ? ?if(!socket->waitForConnected(30000))
? ? ? ? ?{
? ? ? ? ? ? ?qDebug() << "Connection failed!";
? ? ? ? ? ? ?return;
? ? ? ? ?}
? ? ? ? ?qDebug() << "Connect successfully!";
??
? ? ? ? ?//發(fā)送按鍵使能
? ? ? ? ?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();
? ? ? //獲取文本框內(nèi)容并以ASCII碼形式發(fā)送
? ? ?socket->write(ui->textEdit_Send->toPlainText().toLatin1());
? ? ?socket->flush();
?}
??
?void MainWindow::socket_Read_Data()
?{
? ? ?QByteArray buffer;
? ? ?//讀取緩沖區(qū)數(shù)據(jù)
? ? ?buffer = socket->readAll();
? ? ?if(!buffer.isEmpty())
? ? ?{
? ? ? ? ?QString str = ui->textEdit_Recv->toPlainText();
? ? ? ? ?str+=tr(buffer);
? ? ? ? ?//刷新顯示
? ? ? ? ?ui->textEdit_Recv->setText(str);
? ? ?}
?}
??
?void MainWindow::socket_Disconnected()
?{
? ? ?//發(fā)送按鍵失能
? ? ?ui->pushButton_Send->setEnabled(false);
? ? ?//修改按鍵文字
? ? ?ui->pushButton_Connect->setText("連接");
? ? ?qDebug() << "Disconnected!";
?}

最后是ui的設(shè)計:

二、服務(wù)器

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

(1)創(chuàng)建QTcpSever對象

server = new QTcpServer();

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

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

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

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

(4)使用socket的write函數(shù)向客戶端發(fā)送數(shù)據(jù)

socket->write(data);

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

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

(6)取消偵聽

server->close();

2、以下是服務(wù)器的例程

首先是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();
??
? ? ? ? ?//監(jiān)聽指定的端口
? ? ? ? ?if(!server->listen(QHostAddress::Any, port))
? ? ? ? ?{
? ? ? ? ? ? ?//若出錯,則輸出錯誤信息
? ? ? ? ? ? ?qDebug()<<server->errorString();
? ? ? ? ? ? ?return;
? ? ? ? ?}
? ? ? ? ?//修改按鍵文字
? ? ? ? ?ui->pushButton_Listen->setText("取消偵聽");
? ? ? ? ?qDebug()<< "Listen succeessfully!";
? ? ?}
? ? ?else
? ? ?{
?/*
? ? ? ? ?//如果正在連接(點擊偵聽后立即取消偵聽,若socket沒有指定對象會有異常,應(yīng)修正——2017.9.30)
? ? ? ? ?if(socket->state() == QAbstractSocket::ConnectedState)
? ? ? ? ?{
? ? ? ? ? ? ?//關(guān)閉連接
? ? ? ? ? ? ?socket->disconnectFromHost();
? ? ? ? ?}
?*/
? ? ? ? ?socket->abort();
? ? ? ? ?//取消偵聽
? ? ? ? ?server->close();
? ? ? ? ?//修改按鍵文字
? ? ? ? ?ui->pushButton_Listen->setText("偵聽");
? ? ? ? ?//發(fā)送按鍵失能
? ? ? ? ?ui->pushButton_Send->setEnabled(false);
? ? ?}
??
?}
??
?void MainWindow::on_pushButton_Send_clicked()
?{
? ? ?qDebug() << "Send: " << ui->textEdit_Send->toPlainText();
? ? ?//獲取文本框內(nèi)容并以ASCII碼形式發(fā)送
? ? ?socket->write(ui->textEdit_Send->toPlainText().toLatin1());
? ? ?socket->flush();
?}
??
?void MainWindow::server_New_Connect()
?{
? ? ?//獲取客戶端連接
? ? ?socket = server->nextPendingConnection();
? ? ?//連接QTcpSocket的信號槽,以讀取新數(shù)據(jù)
? ? ?QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
? ? ?QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
? ? ?//發(fā)送按鍵使能
? ? ?ui->pushButton_Send->setEnabled(true);
??
? ? ?qDebug() << "A Client connect!";
?}
??
?void MainWindow::socket_Read_Data()
?{
? ? ?QByteArray buffer;
? ? ?//讀取緩沖區(qū)數(shù)據(jù)
? ? ?buffer = socket->readAll();
? ? ?if(!buffer.isEmpty())
? ? ?{
? ? ? ? ?QString str = ui->textEdit_Recv->toPlainText();
? ? ? ? ?str+=tr(buffer);
? ? ? ? ?//刷新顯示
? ? ? ? ?ui->textEdit_Recv->setText(str);
? ? ?}
?}
??
?void MainWindow::socket_Disconnected()
?{
? ? ?//發(fā)送按鍵失能
? ? ?ui->pushButton_Send->setEnabled(false);
? ? ?qDebug() << "Disconnected!";
?}

最后是ui的設(shè)計:

三、運行結(jié)果

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解C++中static的用法

    詳解C++中static的用法

    這篇文章主要介紹了c++中static的用法詳解,C 語言的 static 關(guān)鍵字有三種用途,具體內(nèi)容詳情大家跟隨腳本之家小編一起學習吧
    2018-05-05
  • OpenGL通過中點法繪制直線和圓

    OpenGL通過中點法繪制直線和圓

    這篇文章主要為大家詳細介紹了OpenGL通過中點法繪制直線和圓,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語言鏈表實現(xiàn)歌手評分系統(tǒng)

    C語言鏈表實現(xiàn)歌手評分系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言鏈表實現(xiàn)歌手評分系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++實現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖)

    C++實現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++二叉樹結(jié)構(gòu)的建立與基本操作

    C++二叉樹結(jié)構(gòu)的建立與基本操作

    二叉樹是數(shù)據(jù)結(jié)構(gòu)中的樹的一種特殊情況,有關(guān)二叉樹的相關(guān)概念,這里不再贅述,如果不了解二叉樹相關(guān)概念,建議先學習數(shù)據(jù)結(jié)構(gòu)中的二叉樹的知識點
    2013-10-10
  • 利用C語言替換文件中某一行的方法

    利用C語言替換文件中某一行的方法

    大家都知道C語言提供了文件操作,但是替換文件的某一行比較麻煩,下面是我使用的一個方法,現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒。
    2016-09-09
  • C/C++實現(xiàn)個人收支系統(tǒng)的示例代碼

    C/C++實現(xiàn)個人收支系統(tǒng)的示例代碼

    這篇文章主要介紹了C/C++實現(xiàn)個人收支系統(tǒng),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-用棧實現(xiàn)表達式求值的方法詳解

    數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-用棧實現(xiàn)表達式求值的方法詳解

    本篇文章是對在c語言中用棧實現(xiàn)表達式求值的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • TypeScript的函數(shù)定義與使用案例教程

    TypeScript的函數(shù)定義與使用案例教程

    這篇文章主要介紹了TypeScript的函數(shù)定義與使用案例教程,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++詳細講解圖的拓撲排序

    C++詳細講解圖的拓撲排序

    拓撲排序(Topological?Sorting)若一個由圖中所有點構(gòu)成的序列?A?滿足:對于圖中的每條邊?(x,y),x?在?A?中都出現(xiàn)在?y?之前,則稱?A?是該圖的一個拓撲序列
    2022-05-05

最新評論