最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實(shí)現(xiàn)簡(jiǎn)單的TCP通信

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

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

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

QT += network

一、客戶端

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

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

socket = new QTcpSocket();

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

socket->connectToHost(IP, port);

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

socket->write(data);

(4)當(dāng)socket接收緩沖區(qū)有新數(shù)據(jù)到來(lái)時(shí),會(huì)發(fā)出readRead()信號(hào),因此為該信號(hào)添加槽函數(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)斷開(kāi)與服務(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();
??
? ? ?//連接信號(hào)槽
? ? ?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();
? ? ? ? ?//獲取端口號(hào)
? ? ? ? ?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("斷開(kāi)連接");
? ? ?}
? ? ?else
? ? ?{
? ? ? ? ?//斷開(kāi)連接
? ? ? ? ?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è)計(jì):

二、服務(wù)器

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

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

server = new QTcpServer();

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

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

(3)當(dāng)服務(wù)器被客戶端訪問(wèn)時(shí),會(huì)發(fā)出newConnection()信號(hào),因此為該信號(hào)添加槽函數(shù),并用一個(gè)QTcpSocket對(duì)象接受客戶端訪問(wèn)

?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)當(dāng)socket接收緩沖區(qū)有新數(shù)據(jù)到來(lái)時(shí),會(huì)發(fā)出readRead()信號(hào),因此為該信號(hào)添加槽函數(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)取消偵聽(tīng)

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();
??
? ? ?//連接信號(hào)槽
? ? ?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("偵聽(tīng)"))
? ? ?{
? ? ? ? ?//從輸入框獲取端口號(hào)
? ? ? ? ?int port = ui->lineEdit_Port->text().toInt();
??
? ? ? ? ?//監(jiān)聽(tīng)指定的端口
? ? ? ? ?if(!server->listen(QHostAddress::Any, port))
? ? ? ? ?{
? ? ? ? ? ? ?//若出錯(cuò),則輸出錯(cuò)誤信息
? ? ? ? ? ? ?qDebug()<<server->errorString();
? ? ? ? ? ? ?return;
? ? ? ? ?}
? ? ? ? ?//修改按鍵文字
? ? ? ? ?ui->pushButton_Listen->setText("取消偵聽(tīng)");
? ? ? ? ?qDebug()<< "Listen succeessfully!";
? ? ?}
? ? ?else
? ? ?{
?/*
? ? ? ? ?//如果正在連接(點(diǎn)擊偵聽(tīng)后立即取消偵聽(tīng),若socket沒(méi)有指定對(duì)象會(huì)有異常,應(yīng)修正——2017.9.30)
? ? ? ? ?if(socket->state() == QAbstractSocket::ConnectedState)
? ? ? ? ?{
? ? ? ? ? ? ?//關(guān)閉連接
? ? ? ? ? ? ?socket->disconnectFromHost();
? ? ? ? ?}
?*/
? ? ? ? ?socket->abort();
? ? ? ? ?//取消偵聽(tīng)
? ? ? ? ?server->close();
? ? ? ? ?//修改按鍵文字
? ? ? ? ?ui->pushButton_Listen->setText("偵聽(tīng)");
? ? ? ? ?//發(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的信號(hào)槽,以讀取新數(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è)計(jì):

三、運(yùn)行結(jié)果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入理解c++指針的指針和指針的引用

    深入理解c++指針的指針和指針的引用

    下面小編就為大家?guī)?lái)一篇深入理解c++指針的指針和指針的引用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C語(yǔ)言實(shí)現(xiàn)線索二叉樹(shù)的前中后創(chuàng)建和遍歷詳解

    C語(yǔ)言實(shí)現(xiàn)線索二叉樹(shù)的前中后創(chuàng)建和遍歷詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)線索二叉樹(shù)的前中后創(chuàng)建和遍歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++俄羅斯方塊游戲 無(wú)需圖形庫(kù)的俄羅斯方塊

    C++俄羅斯方塊游戲 無(wú)需圖形庫(kù)的俄羅斯方塊

    這篇文章主要為大家詳細(xì)介紹了無(wú)需圖形庫(kù)的C++俄羅斯方塊游戲,重溫經(jīng)典游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 淺談C++STL之雙端隊(duì)列容器

    淺談C++STL之雙端隊(duì)列容器

    deque雙端隊(duì)列容器與vector很類似,采用線性表順序存儲(chǔ)結(jié)構(gòu)。但與vector區(qū)別,deque采用分塊的線性存儲(chǔ)結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),每塊的大小一般為512B,將之稱為deque塊,所有的deque塊使用一個(gè)map塊進(jìn)行管理,每個(gè)map數(shù)據(jù)項(xiàng)記錄各個(gè)deque塊的首地址。
    2021-06-06
  • C語(yǔ)言遞歸函數(shù)與漢諾塔問(wèn)題簡(jiǎn)明理解

    C語(yǔ)言遞歸函數(shù)與漢諾塔問(wèn)題簡(jiǎn)明理解

    遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無(wú)論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個(gè)函數(shù)(然后可能又調(diào)用第三個(gè)函數(shù)等),最后又調(diào)用第一個(gè)函數(shù)。因?yàn)楹瘮?shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結(jié)束條件
    2022-07-07
  • C++中的異或運(yùn)算符^的使用方法

    C++中的異或運(yùn)算符^的使用方法

    本篇文章對(duì)C++中的異或運(yùn)算符^的使用方法進(jìn)行的詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 全面解析C++中的析構(gòu)函數(shù)

    全面解析C++中的析構(gòu)函數(shù)

    這篇文章主要介紹了C++中的析構(gòu)函數(shù),為C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • C指針原理教程之語(yǔ)法樹(shù)及其實(shí)現(xiàn)

    C指針原理教程之語(yǔ)法樹(shù)及其實(shí)現(xiàn)

    本文給大家分享的是如何使用C語(yǔ)言的指針原來(lái)來(lái)實(shí)現(xiàn)語(yǔ)法樹(shù),并給大家提供了詳細(xì)的實(shí)例代碼,希望大家能夠喜歡
    2019-02-02
  • C語(yǔ)言動(dòng)態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解

    C語(yǔ)言動(dòng)態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解

    在C語(yǔ)言中,動(dòng)態(tài)內(nèi)存函數(shù)是塊重要的知識(shí)點(diǎn),以往,我們開(kāi)辟空間都是固定得,數(shù)組編譯結(jié)束后就不能繼續(xù)給它開(kāi)辟空間了,開(kāi)辟的空間滿了,就不能在開(kāi)辟空間了,學(xué)習(xí)本文章,我們就可以解決這個(gè)問(wèn)題,向內(nèi)存申請(qǐng)空間,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-08-08

最新評(píng)論

会东县| 治县。| 福贡县| 黑水县| 广饶县| 淮安市| 西乌珠穆沁旗| 吴川市| 洛南县| 綦江县| 龙南县| 夏邑县| 商洛市| 交口县| 鲁甸县| 吴堡县| 绥德县| 中卫市| 宁德市| 宝兴县| 永吉县| 德兴市| 黄浦区| 喀喇沁旗| 建平县| 闸北区| 芜湖市| 铜梁县| 丽江市| 宜兰市| 双柏县| 银川市| 齐河县| 彭阳县| 商城县| 崇信县| 景泰县| 万州区| 贵州省| 杂多县| 荃湾区|