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

Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序

 更新時(shí)間:2022年08月22日 09:56:03   作者:梁光林  
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

復(fù)習(xí)的心態(tài)過一遍之前基礎(chǔ)的一些東西,Qt封裝了QTcpServer和QTcpSocket兩個(gè)類,其中QTcpServer繼承自QObject,通過listen()函數(shù)監(jiān)聽傳入的客戶端連接,當(dāng)Client連接上時(shí),QTcpServer會發(fā)出newConnection的信號,在對應(yīng)的槽函數(shù)中使用nextPendingConnection()拿到連接的客戶端的句柄和信息。

而QTcpSocket則是讀寫數(shù)據(jù)的時(shí)候使用,過程很簡單。

服務(wù)器流程:listen->newConnection->nextPendingConnection->readAll/write

客戶端流程:connectToHost->waitForConnected->write/readAll

需要注意的是在使用網(wǎng)絡(luò)相關(guān)的類前,需要在pro文件加上QT += network

通信時(shí):

客戶端掉線時(shí):

QTcpServer服務(wù)器代碼(包含.h和.cpp):

.h

#ifndef WIDGET_H
#define WIDGET_H
?
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
?
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
?
class Widget : public QWidget
{
? ? Q_OBJECT
?
public:
? ? Widget(QWidget *parent = nullptr);
? ? ~Widget();
?
protected slots:
? ? void onSendBtnClicked();
? ? void onNewClientConnected();
? ? void onRecvData();
? ? void onClientDisconnected();
?
private:
? ? void Init();
?
private:
? ? Ui::Widget *ui;
?
private:
? ? QTcpServer *_tcpServer;
? ? QTcpSocket *_tcpSocket;
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
#include <QDebug>
?
#define MyTcpPort 8886
?
Widget::Widget(QWidget *parent)
? ? : QWidget(parent)
? ? , ui(new Ui::Widget)
? ? ,_tcpServer(nullptr)
? ? ,_tcpSocket(nullptr)
{
? ? ui->setupUi(this);
?
? ? connect(this->ui->btn_send,&QPushButton::clicked,this,&Widget::onSendBtnClicked);
?
? ? Init();
?
? ? setWindowTitle("服務(wù)端");
}
?
Widget::~Widget()
{
? ? delete ui;
?
? ? if(_tcpSocket)
? ? {
? ? ? ? _tcpSocket->disconnect();
? ? ? ? _tcpSocket->abort();
? ? ? ? _tcpSocket->close();
? ? ? ? _tcpSocket->deleteLater();
? ? }
? ? if(_tcpServer)
? ? {
? ? ? ? _tcpServer->close();
? ? ? ? delete _tcpServer;
? ? }
}
?
void Widget::Init()
{
? ? _tcpSocket = new QTcpSocket;
? ? _tcpServer = new QTcpServer;
?
? ? int ret = _tcpServer->listen(QHostAddress::AnyIPv4,MyTcpPort);
? ? if(ret==0)
? ? {
? ? ? ? qDebug()<<"_tcpServer->listen is failied";
? ? ? ? return;
? ? }
? ? connect(_tcpServer,&QTcpServer::newConnection,this,&Widget::onNewClientConnected);
}
?
void Widget::onSendBtnClicked()
{
? ? if(!_tcpSocket) return;
?
? ? QString inputText = ui->inputEdit->text();
? ? if(inputText.isEmpty())
? ? ? ? return;
? ? //發(fā)送數(shù)據(jù)
? ? int ret = _tcpSocket->write(inputText.toStdString().c_str());
? ? if(ret<0)
? ? {
? ? ? ? qDebug()<<"write to client is failed!";
? ? }
}
?
void Widget::onNewClientConnected()
{
? ? if(_tcpServer->hasPendingConnections())
? ? {
? ? ? ? _tcpSocket = _tcpServer->nextPendingConnection();
? ? ? ? if(!_tcpSocket->isValid()) return;
? ? ? ? connect(_tcpSocket,&QTcpSocket::readyRead,this,
? ? ? ? ? ? ? ? &Widget::onRecvData);
? ? ? ? connect(_tcpSocket,&QTcpSocket::disconnected,this,
? ? ? ? ? ? ? ? &Widget::onClientDisconnected);
? ? }
}
?
void Widget::onRecvData()
{
? ? if(!_tcpSocket) return;
? ? QString recvData=_tcpSocket->readAll();
? ? qDebug()<<"recvData:"<<recvData;
?
? ? this->ui->recvEdit->append(recvData);
}
?
void Widget::onClientDisconnected()
{
? ? QString clientIp = _tcpSocket->peerAddress().toString();
? ? this->ui->recvEdit->append(clientIp+" is Drop line!");
}

QTcpClient客戶端代碼(包含.h和.cpp):

/.h

#ifndef WIDGET_H
#define WIDGET_H
?
#include <QWidget>
#include <QTcpSocket>
?
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
?
class Widget : public QWidget
{
? ? Q_OBJECT
?
public:
? ? Widget(QWidget *parent = nullptr);
? ? ~Widget();
?
private:
? ? void Init();
?
protected slots:
? ? void onSendBtnClicked();
? ? void onRecvData();
?
private:
? ? Ui::Widget *ui;
?
private:
? ? QTcpSocket *_tcpClient;
};
#endif // WIDGET_H
?
/.cpp
#include "widget.h"
#include "ui_widget.h"
?
#define MyTcpPort 8886
?
Widget::Widget(QWidget *parent)
? ? : QWidget(parent)
? ? , ui(new Ui::Widget),_tcpClient(nullptr)
{
? ? ui->setupUi(this);
?
? ? connect(this->ui->btn_send,&QPushButton::clicked,this,&Widget::onSendBtnClicked);
?
? ? Init();
?
? ? ?setWindowTitle("客戶端");
}
?
Widget::~Widget()
{
? ? delete ui;
?
? ? if(_tcpClient)
? ? {
? ? ? ? _tcpClient->close();
? ? ? ? _tcpClient->deleteLater();
? ? }
}
?
void Widget::Init()
{
? ? _tcpClient=new QTcpSocket;
? ? _tcpClient->abort();
? ? _tcpClient->connectToHost("127.0.0.1",MyTcpPort);
? ? if(!_tcpClient->waitForConnected(2000))
? ? {
? ? ? ? qDebug()<<"connect is failed!";
? ? ? ? return;
? ? }
? ? qDebug()<<"connect is successful";
? ? connect(_tcpClient,&QTcpSocket::readyRead,this,&Widget::onRecvData);
}
?
void Widget::onSendBtnClicked()
{
? ? if(!_tcpClient) return;
?
? ? QString wStr=ui->inputEdit->text();
?
? ? int ret = _tcpClient->write(wStr.toStdString().c_str());
? ? if(ret<0)
? ? {
? ? ? ? qDebug()<<"send data is failed";
? ? }
? ? qDebug()<<"send data is successful!";
}
?
void Widget::onRecvData()
{
? ? if(!_tcpClient) return;
?
? ? QString recvData= _tcpClient->readAll();
? ? ui->recvEdit->append(recvData);
? ? qDebug()<<"recvData:"<<recvData;
}

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

您可能感興趣的文章:

相關(guān)文章

  • C語言實(shí)現(xiàn)魔方比賽管理系統(tǒng)

    C語言實(shí)現(xiàn)魔方比賽管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)魔方比賽管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++實(shí)現(xiàn)圖書管理系統(tǒng)

    C++實(shí)現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 詳解C++的反調(diào)試技術(shù)與繞過手法

    詳解C++的反調(diào)試技術(shù)與繞過手法

    反調(diào)試技術(shù),惡意代碼會用它識別自身是否被調(diào)試,或者讓調(diào)試器失效,給反病毒工程師們制造麻煩,拉長提取特征碼的時(shí)間線,本章將具體總結(jié)常見的反調(diào)試基礎(chǔ)的實(shí)現(xiàn)原理以及如何過掉這些反調(diào)試手段,從而讓我們能夠繼續(xù)分析惡意代碼
    2021-06-06
  • C++學(xué)習(xí)之異常機(jī)制詳解

    C++學(xué)習(xí)之異常機(jī)制詳解

    C++中的異常處理機(jī)制可以幫助我們處理程序在運(yùn)行時(shí)可能會遇到的異常情況,比如內(nèi)存分配錯(cuò)誤、文件打開失敗等。本文就和大家詳細(xì)講講C++中異常機(jī)制的具體使用吧
    2023-04-04
  • C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲實(shí)例

    C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲實(shí)例

    本篇文章主要介紹了C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • C語言 數(shù)據(jù)存儲方式知識點(diǎn)詳解

    C語言 數(shù)據(jù)存儲方式知識點(diǎn)詳解

    在本篇文章里小編給大家整理的是關(guān)于C語言 數(shù)據(jù)存儲方式知識點(diǎn)詳解,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • C++ 二叉搜索樹(BST)的實(shí)現(xiàn)方法

    C++ 二叉搜索樹(BST)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++ 二叉搜索樹(BST)的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下
    2017-04-04
  • C語言關(guān)鍵字auto與register及static專項(xiàng)詳解

    C語言關(guān)鍵字auto與register及static專項(xiàng)詳解

    這篇文章主要解釋了c語言中什么是數(shù)據(jù)類型,什么是變量,他們的真正含義是什么。分析了屬性關(guān)鍵字auto,register和static的用法
    2022-07-07
  • C++?構(gòu)造函數(shù)和析構(gòu)函數(shù)(Constructors?&?Destructors)詳解

    C++?構(gòu)造函數(shù)和析構(gòu)函數(shù)(Constructors?&?Destructors)詳解

    由于global?object的誕生比程序進(jìn)入更早點(diǎn),所以global?object的constructor執(zhí)行的時(shí)間更早于程序的進(jìn)入點(diǎn),所謂的default?constructor就是沒有指定任何的參數(shù)的constructor,這篇文章主要介紹了C++?構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)知識,需要的朋友可以參考下
    2024-05-05
  • C語言文件操作詳解以及詳細(xì)步驟

    C語言文件操作詳解以及詳細(xì)步驟

    文件(file)一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合,比如我們經(jīng)常使用的.txt,?.bmp,?jpg.?.exe,.rmvb等等,下面這篇文章主要給大家介紹了關(guān)于C語言文件操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06

最新評論

宁河县| 珠海市| 湖州市| 禄丰县| 赞皇县| 定襄县| 靖宇县| 松阳县| 大安市| 临漳县| 门头沟区| 石门县| 聊城市| 商水县| 三台县| 巴塘县| 黎平县| 比如县| 江永县| 大冶市| 鄂尔多斯市| 阿勒泰市| 同仁县| 宣城市| 镇沅| 剑河县| 长丰县| 台北市| 溆浦县| 久治县| 彭泽县| 隆子县| 阿拉善右旗| 奎屯市| 乌拉特后旗| 西宁市| 永吉县| 永城市| 吉木乃县| 九江县| 汝阳县|