Qt实现TCP客户端和服务器通讯程序

基于QT实现的TCP连接的网络通信(客户端) 阅读详情

复习的心态过一遍之前基础的一些东西,Qt封装了QTcpServer和QTcpSocket两个类,其中QTcpServer继承自QObject,通过listen()函数监听传入的客户端连接,当Client连接上时,QTcpServer会发出newConnection的信号,在对应的槽函数中使用nextPendingConnection()拿到连接的客户端的句柄和信息。

而QTcpSocket则是读写数据的时候使用,过程很简单。

服务器流程:listen->newConnection->nextPendingConnection->readAll/write

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

需要注意的是在使用网络相关的类前,需要在pro文件加上QT += network

通信时:

客户端掉线时:

 

QTcpServer服务器代码(包含.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("服务端");
}

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;
    //发送数据
    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;
}

QTcpSocket-Qt使用Tcp通讯实现服务端和客户端 基本功能 详细说明请见官方文档 范例代码见GitHub:QtOtherModuleExamples pro文件配置 使用Qt网络功能需要在pro文件增加网络库 QT += network QTcpServer服务端建立 QTcpServer server = new QTcpServer(); connect(server, &QTcpServ... 阅读详情

相关推荐

Qt TCP通讯简易Demo

在Qt上建立Tcp server 和 client 间的简易通讯,实现效果如下 //mainwindow.h #include "tcpserverwindow.h" #include "ui_tcpserverwindow.h" TcpServerWindow::TcpServerWindow(QWidget *parent) : QDial

0.0 4112

QT TCP客户端实现

QTcpSocket实例首先是通过connectToHost()尝试连接到服务器,需要指定服务器的IP地址和端口。connectToHost()是异步方式连接服务器,不会阻塞程序运行,连接后发射connected()信号。如果需要使用阻塞方式连接服务器,则使用waitForConnected()函数阻塞程序运行,直到连接成功或失败。与服务器建立连接后,就可以向缓冲区写数据或从接收缓冲区读取数据,实现数据的通信。

hw5230的博客 2279

QT自制TCP客户端

QT自制TCP客户端,亲测可用

大脑曝光 4680

QT学习笔记之TCP通信2(TCP客户端)

本文介绍了使用Qt进行TCP网络编程中TCP客户端创建的基本步骤和方法。首先,介绍了创建TCP客户端需要使用QTcpSocket类;接着,文章详细描述了如何新建Qt工程;然后,介绍了如何使用QTcpSocket类;文章还详细阐述了设置UI界面的步骤;最后,文章提供了实现TCP客户端功能的具体逻辑代码,包括打开客户端、接收数据、发送数据和关闭客户端的实现方法。通过信号和槽机制,实现了对连接、数据读取和写入等事件的处理。

Yz12333的博客 4345

基于Qt开发的TCP客户端软件

本文是基于Qt开发TCP客户端软件的完整实现指南,含多线程处理逻辑,结合技术要点与代码示例进行分步说明

半青年的博客 940

告别Qt Creator?手把手教你用VSCode+MinGW调试QT项目(附完整launch.json配置)

本文详细介绍了如何在VSCode中配置完整的QT开发环境,特别是针对使用MinGW编译器的用户。从环境搭建到调试配置,包括生成.pro文件、Makefile,以及配置task.json和launch.json文件,帮助开发者高效调试QT项目。

weixin_27180827的博客 186

探索高效通信:QT多线程TCP服务器客户端通讯程序

探索高效通信:QT多线程TCP服务器客户端通讯程序 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代网络应用中,高效且可靠的通信机制是确保系统稳定运行的关键。QT多线程TCP服务器客户端通讯程序 是一个基于QT框架实现的多线程TCP通信示例,旨在演示如何在多客户端环境下实现服务器与客户端之间的高效通信。通过利用QT强大的网络库和线程管理能力,每个客户端连接都将由服...

gitblog_09773的博客 369

保姆级教程:在K230开发板上为张大头步进电机实现位置、速度、回零全功能控制

本文提供了一份详细的K230开发板与张大头步进电机的控制教程,涵盖硬件连接、协议解析、模块化代码实现及实战案例。通过位置、速度和回零功能的全面讲解,帮助开发者快速掌握步进电机的高级控制技术,适用于自动化、机器人等应用场景。

weixin_42629671的博客 708

Qt 服务器/客户端TCP通讯

基于Qt的TCP网络通讯编程

shouqw的博客 3675

AD620仪表放大器模块实战:从双电源切换到单电源供电的完整指南(附原理图)

本文深入探讨了AD620仪表放大器模块从双电源切换到单电源供电的常见陷阱与正确方案。通过解析AD620的内部架构与电气特性,指出其“天生”依赖双电源,简单的跳线改装会导致芯片损坏或失效。文章提供了基于AD623芯片的真正单电源替代方案,并附有原理图与实战波形对比,为便携式设备设计提供了完整指南。

weixin_29231027的博客 365

利用NURBS曲线进行点云曲面拟合算法

点云拟合曲面算法是将点云数据拟合成一个二次或高次曲面模型的算法。这种算法主要用于三维模型重建、计算机视觉、机器人感知、医学图像处理等领域。最小二乘法(Least Squares Method):通过最小化点到曲面距离的平方和来拟合曲面模型。三角剖分算法(Triangulation-Based Method):将点云构建成三角网格,再拟合成曲面模型。隐式曲面算法(Implicit Surface Method):通过定义一个隐式函数来表示曲面,然后用点云数据来估计隐式函数的系数。

weixin_44770969的博客 1万+

QT的TCP通讯

在网络编程领域,TCP(Transmission Control Protocol,传输控制协议)是一种广泛应用的可靠传输协议。QT 作为一个强大的跨平台 C++ 应用程序开发框架,提供了丰富的类库来支持 TCP 通讯的开发。本文将详细介绍如何使用 QT 进行 TCP 通讯,包括客户端和服务器端的实现,希望能帮助大家快速上手相关开发

千千道的博客 2970

医学图像中的小目标病灶检测难题:我的硕士研究总结与思考

医学图像中的小目标检测和分割,主要指在CT、MRI、超声等医学影像中识别和分割微小病灶或细小结构。这些小目标通常体积小、边界模糊、特征不明显,却往往是关键病灶,例如肺部小结节、脑微出血、乳腺微钙化等。

weixin_45638136的博客 2368

QT多线程TCP服务器客户端通讯编程

在QT网络编程中,服务器往往需要和多个客户端保持连接,因此,我在熟悉多线程编程过程中,在TCP服务每接收到一个客户端连接请求,就新建一个线程。客户端也是在新建的线程中维护的。 程序的思路如下: 程序使用了非模式对话框来分别显示服务器和客户端,默认情况下客户端使用127.0.0.1这个本地IP来和自己进程内的服务器通讯。服务器在监听到新客户端的连接请求后新建对话框以及一个线程与客户端通讯,客户端建立连接成功后会将自己的线程ID发送给服务器,服务器接收到数据后将自己的线程ID返回给客户端。客户端断开连接后会自动

haohaoganhuo的专栏 5466

关于SVPWM七段式五段式调制后的相电压和线电压波形——大疆DJI技术笔试

1.SVPWM七段式/五段式调制的相电压和线电压波形 脉宽调制(PWM)在并网变流技术中得到了广泛的应用。与正弦脉宽调制(SPWM)的控制方法相比,SVPWM方法具有直流侧电压利用率高,电压谐波小,易于数字化实现等显著的优点,从而使SVPWM在实际的应用中越来越普遍。TMS320F28335是32位浮点的DSP控制器,具有150MHz的高速处理能力,18路PWM输出,与前几代数字信号控制器相比,性能平均提高了50%。其中具体的SVPWM理论实现的原理,请参考我的博客永磁同步电机的矢量控制策略(七)一一一SV

昔时扬尘处 2万+

常说的cache机制到底是什么?L1 cache和 L2 cache是什么?

一文带你迅速了解CPU内的cache机制!!图解多核CPU中的多级cache结构。为何有的处理器没有cache?

车载系统攻城狮 5875

基于Qt的多线程TCP即时通讯软件的设计与实现

基于Qt的多线程TCP即时通讯软件的设计与实现 本文将从涉及到主要技术开始,讲解使用Qt来实现一个支持多客户端链接的多线程TCP服务器及其客户端的设计与实现的解决方案。 注:本文使用的开发环境为Qt5.15.2,使用MSVC2019_64编译器,C++11及以上

SWULWJ的博客 1万+

【推荐100个unity插件之24】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

【推荐100个unity插件之23】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1682

使用QT编写MODBUS-TCP服务器与客户端程序

这个系列文章的主要目的还是要记录我熟悉QT编程的一个过程,同时也可以让其他开始使用QT编程的人有一个参考,少走些弯路。基于以上目的,我就从我所擅长的工业数据采集入手,用QT编写一个和数据采集有关的程序。在工业数据采集领域,MODBUS是一种应用广泛的总线协议,非常适合应用在低速采集的领域,早期的MODBUS协议只支持串口,后来发展出基于以太网口的MODBUS-TCP协议,我最终要用QT实现的,就是一个MODBUS-TCP服务器,以及与之通讯的MODBUS-TCP客户端。协议相关资料请看 MODBUS-TCP

haohaoganhuo的专栏 8353

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

QT示例:基于TCP点对点Socket通讯

QT学习笔记(十六):基于TCP点对点通讯示例一、 概述二、TCP 协议工作原理三、TCP 编程模型四、基于TCP点对点通讯示例1、客户端2、客户端Client示例3、服务器4、服务器server示例 一、 概述 二、TCP 协议工作原理 三、TCP 编程模型 四、基于TCP点对点通讯示例 1、客户端 客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只...

Leon_Chen的博客 1807

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

基于QT的TCP通讯实现

TCP协议概述 主要特点 1.TCP是面向连接的运输层协议。应用和曾许在使用TCP协议之前,必须首先建立TCP连接。在传输数据完毕之后,必须将已经建立好的TCP给释放。也就是说,应用进程之间的通信好像在“打电话”:通话之前首先要拨通号码建立连接,通话结束之后必须挂掉电话释放连接。 2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。 3.TCP提供的是可靠交付的服务。通过T...

愿万事胜意 1046

【Qt专栏】Qt实现TCP服务端和客户端通信

网络通信是程序员必须会的一项生存技能,这里简单的实现了服务端和客户端通信的两个小示例,代码可以直接拿来用,开发环境是Qt5.9.6。原理后序会专门写篇文章,这里可以直接照着上述写就OK啦,886!

weixin_43729127的博客 4335

c++中如何以服务器为消息转发跳板实现客户之间的TCP通讯

利用TCP通讯技术实现了A客户与B客户以服务器为消息转发跳板进行信息通讯。

记录自己喜欢的技术知识 1399

Qt实现TCP通信

Qt要实现TCP通信需要两个类,第一个是服务器端,需要用到QTcpServer类,第二个是客户端,需要用到QTcpSocket类。另外,要想在Qt中进行网络通信,需要在pro文件中加入network模块。C语言建立Tcp通信时,需要经历“socket函数创建套接字-->bind绑定地址结构-->listen设置最大监听数-->accept监听来自客户端的连接”这几个阶段,QTcpServer中的listen函数就相当于C语言中bind和listen的功能。

2301_81261654的博客 1577

QT网络(二):TCP通信

介绍在QT中使用TCP协议进行数据通信,包括服务器端和客户端

路漫漫其修远兮,吾将上下而求索 2693

QT示例:基于TCP 点对多Socket通讯(server,clients)

QT示例:基于TCP 点对多通讯(server)一、 概述 一、 概述 因为对于客户端来说,只能连接一个服务器。而对于服务器来说,它是面向多连接的,如何协调处理多客户端连接就显得尤为重要。 注意问题: 每个新加入的客户端,服务器给其分配一个SocketDescriptor后,就会emit newConnection()信号,但分配好的SocketDecriptor并没有通过newConnecti...

Leon_Chen的博客 3128
上一篇: Qt之connect函数—信号槽连接的几种方式和优缺点
下一篇: Qt之QTableView显示鼠标悬浮下的项的信息
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值