Qt 的TCP网络通信

2023-11-13

 

Qt网络通信:

Socket 通信:

Qt 中提供的所有的 Socket 类都是非阻塞的。

Qt 中常用的用于Socket 通信的套接字类

QTCPServer:用于TCP/IP 通信,作为服务器端套接字使用。

QTCPSocket:用于TCP/IP 通信,作为客户端套接字使用。

QUDPSocket:用于UDP通信,服务器,客户端均使用此套接字。

 

TCP/IP:

在Qt 中实现TCP/IP 服务器端通信的流程:

(1)创建套接字;(2)将套接字设置为监听模式;(3)等待并接受客户的需求;[可以通过QTCPServer 提供的void newConnection() 信号来检测是否有连接请求,如果有可以在对应的槽函数中调用nextPendingconnection()函数获取到客户端的Socket 信息(返回值为QTCPSocket*类型指针),通过此套接字与客户端之间进行通信。];(3)接收或者向客户端发送数据 [① 接收数据:使用read() 或者readAll() 函数;② 发送数据:使用write()函数]

客户端通信流程:

(1)创建套接字;(2)连接服务器 [可以使用QTCPSocket 类的connectionToHost() 函数来连接服务器];(3)向服务器发送或者接收数据

在开始之前 ServerTCP.pro:(项目名称为ServerTCP)

添加如下代码:

服务器端:

添加Client 客户端的文件:

右键项目名称 -> 添加新文件 -> 

客户端:

在服务器端和客户端的textEditRead 栏中将其设置为 “只读”

服务器端:

点击ui的Send 和Close的按钮:右键 -> 转到槽;

客户端:

点击ui的Send 、Close和 connect的按钮:右键 -> 转到槽;

 

代码段:

服务器:

Serverwidget.h

#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H

#include <QWidget>
#include <QTcpServer> //监听套接字
#include <QTcpSocket> //通信套接字

#include <QMouseEvent>
namespace Ui {
class ServerWidget;
}

class ServerWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ServerWidget(QWidget *parent = 0);
    ~ServerWidget();
protected:
    void paintEvent(QPaintEvent *event);

private slots:
    void on_send_clicked();

    void on_close_clicked();

private:
    Ui::ServerWidget *ui;

    QTcpServer *tcpServer;//监听套接字
    QTcpSocket *tcpSocket;//通信套接字

};

#endif // SERVERWIDGET_H

 

Serverwidget.cpp

#include "serverwidget.h"
#include "ui_serverwidget.h"
#include <QPainter>

ServerWidget::ServerWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ServerWidget)
{
    ui->setupUi(this);
    tcpServer = NULL;
    tcpSocket = NULL;

    setWindowTitle("服务器端");
    //监听套接字,指定父对象,让其自动回收空间
    tcpServer = new QTcpServer(this);
    tcpServer->listen(QHostAddress::Any,666);
    connect(tcpServer,&QTcpServer::newConnection,
            [=]()
            {
                //取出建立好连接的套接字
                tcpSocket = tcpServer->nextPendingConnection();

                //获取对方的IP和端口
                QString ip = tcpSocket->peerAddress().toString();
                qint16 port = tcpSocket->peerPort();
                QString temp = QString("[%1:%2]:成功链接").arg(ip).arg(port);
                ui->textEditRead->setText(temp);

                connect(tcpSocket,&QTcpSocket::readyRead,
                        [=]()
                        {
                            //从通信套接字中取出内容
                            QByteArray array = tcpSocket->readAll();
                            ui->textEditRead->append(array);
                        }
                        );
            }
            );

}

ServerWidget::~ServerWidget()
{
    delete ui;
}

void ServerWidget::on_send_clicked()
{
    //获取编辑区内容
    if(NULL == tcpSocket)
    {
        return;
    }
    QString str = ui->textEditWrite->toPlainText();
    //给对方发送数据,使用套接字是TCPSocket
    tcpSocket->write(str.toUtf8().data());
}


void ServerWidget::on_close_clicked()
{
    //主动和客户端断开连接
    if(NULL == tcpSocket)
    {
        return;
    }
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
    tcpSocket = NULL;
}
void ServerWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawPixmap(0,0,width(),height(),QPixmap(":/new/prefix1/Image/1.jpg"));
}

客户端:

clientwidget.h

#ifndef CLIENWIDGET_H
#define CLIENWIDGET_H

#include <QWidget>
#include <QTcpSocket>//通信套接字

namespace Ui {
class ClienWidget;
}

class ClienWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ClienWidget(QWidget *parent = 0);
    ~ClienWidget();
protected:
    void paintEvent(QPaintEvent *event);

private slots:
    void on_pushButtonConnect_clicked();

    void on_pushButtonSend_clicked();

    void on_pushButtonClose_clicked();

private:
    Ui::ClienWidget *ui;
    QTcpSocket *tcpsocket;//通信套接字
};

#endif // CLIENWIDGET_H

clientwidget.cpp

#include "clienwidget.h"
#include "ui_clienwidget.h"
#include <QHostAddress>
#include <QPainter>
ClienWidget::ClienWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClienWidget)
{
    ui->setupUi(this);

    ui->textEditRead->setStyleSheet("background-image:url(:/new/prefix1/Image/5C74F1D9198348410F91F4EA3EAD6FB2.jpg);");
    ui->textEditWrite->setStyleSheet("background-image:url(:/new/prefix1/Image/8A141585F1E8C5BD63F80D15DB9826E2.jpg)");

    tcpsocket = NULL;

    //分配空间,指定父对象
    tcpsocket = new QTcpSocket(this);
    setWindowTitle("客户端");

    connect(tcpsocket,&QTcpSocket::connected,
            [=]()
            {
                ui->textEditRead->setText("成功和服务器建立好链接");

            }
            );
    connect(tcpsocket,&QTcpSocket::readyRead,
            [=]()
            {
                //获取对方发送的内容
                QByteArray array = tcpsocket->readAll();
                //追加到编辑区中
                ui->textEditRead->append(array);
            }
            );

}

ClienWidget::~ClienWidget()
{
    delete ui;
}



void ClienWidget::on_pushButtonConnect_clicked()
{
    //获取服务器端口和IP
    QString ip = ui->lineEditIP->text();
    qint16 port = ui->lineEditPort->text().toInt();
    //主动和服务器建立连接
    tcpsocket->connectToHost(QHostAddress(ip),port);
}

void ClienWidget::on_pushButtonSend_clicked()
{
    //获取编辑框内容
    QString str = ui->textEditWrite->toPlainText();
    //发送数据
    tcpsocket->write(str.toUtf8().data());
}

void ClienWidget::on_pushButtonClose_clicked()
{
    //主动和对方断开连接
    tcpsocket->disconnectFromHost();
    tcpsocket->close();
}

void ClienWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawPixmap(0,0,width(),height(),QPixmap(":/new/prefix1/Image/bk.jpg"));
}

 

添加资源:

右击项目 -> 添加新文件 -> 

项目会出现 Resources -> image.qrc 右击 -> open in Editor

效果:

点击连接后:

课外了解

Qt TCP 网络通信的结构:

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 的TCP网络通信 的相关文章

随机推荐

  • HQL之分区表

    分区表 分区表实际上就是对应一个HDFS文件系统上的独立的文件夹 该文件夹下是该分区所有的数据文件 Hive中的分区就是分目录 把一个大的数据集根据业务需要分割成小的数据集 在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区 这
  • centos安装mysql遇到的问题

    一 提示mysql community libs compat的GPG不对 错误信息 warning var cache yum x86 64 7 mysql57 community packages mysql community lib
  • acc 蓝牙_蓝牙中的三种音频编码:Apt-X、SBC、AAC,请问分别有什么区别?

    展开全部 SBC一般的音频格式 蓝牙传输在不支持AAC aptx的时候都用SBC传输 音质一般 现在80 都是这种格式 AAC 当蓝62616964757a686964616fe4b893e5b19e31333365653164牙支持AAC
  • NCBI(pubmed)里医学主题词(MeSH)完整词库获取

    NCBI pubmed 里医学主题词 MeSH 完整词库获取 转载提示 原创文章 转载前请联系我 文章目录 NCBI pubmed 里医学主题词 MeSH 完整词库获取 前言 一 MeSH词库是什么 二 获取MeSH词库的方式 1 从官网的
  • caffe代码阅读8: Data_layers的实现细节(各个数据读取层的实现细节) 2016.3.25-28

    一 Data layers hpp文件的作用简介 Data layers hpp在目前caffe的master分支中已经不能存在了 分散到各个文件中去了 而之前是存在于cafferoot include caffe中 现在已经变成了各个类的
  • 火线、零线和地线及开关接线参考

    火线 零线和地线及开关接线参考 1 火线 零线和地线 1 1 What is Live wire Live wire L 火线 相线 火线是电路中输送电的电源线 1 2 What is Neutral wire Neutral wire N
  • 2022陕西省网络搭建及应用技能大赛windows服务器搭建部分答案视频

    2022陕西省网络搭建及应用技能大赛windows服务器搭建部分答案视频资源 CSDN文库 https download csdn net download weixin 41687096 87684084
  • Gateway服务网关入门

    Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目 该项目是基于 Spring 5 0 Spring Boot 2 0 和 Project Reactor 等响应式编程和事件流技术
  • Android之 内存泄漏问题检测和解决

    一 背景 1 1 什么是内存泄漏 内存泄漏指程序在申请内存后 无法释放已申请的内存空间 导致系统无法及时回收内存并且分配给其他进程使用 1 2 内存管理 1 3 垃圾回收 上面可以看出GC回收的主要对象是java堆 也就是new出来的对象
  • Zipkin链路追踪

    Zipkin链路追踪技术分享 什么是Zipkin Zipkin 是 Twitter 的一个开源项目 它基于 Google Dapper 实现 它致力于收集服务的定时数据 以 解决微服务架构中的延迟问题 包括数据的收集 存储 查找和展现 我们
  • Python实现移动平均数

    首先 什么是移动平均数呢 来自百度百科 若依次得到测定值 时 按顺序取一定个数所做的全部算术平均值 例如 等是移动平均值 详细可以点击此处链接 Python中是如何实现呢
  • 电子科技大学计算机系统结构复习笔记(三):流水线技术

    目录 前言 重点一览 流水线定义 基本概念 流水线分类 流水线特点 流水线时空图 流水线性能分析 流水线特点 经典5段流水线RISC处理器 流水线的三种冒险 冒险分类 停顿流水线 结构冒险 数据冒险 控制冒险 流水线处理机的指令系统 流水线
  • kitti数据集解析以及在mmdection3d中的pkl文件参数解析

    kiiti数据集介绍 kitti数据集存在4个相机 其中0和1为灰度相机 2和3为彩色相机 各设备之间的安装示意图如下所示 如图所示 相机坐标系 x轴向右 y轴向下 z轴向前 雷达坐标系 x轴向前 y轴向左 z轴向上 GPS IMU坐标系
  • STM32项目设计:基于stm32f4的智能门锁(附项目视频全套教程、源码资料)

    文章目录 智能门锁 一 项目背景 二 项目功能要求 三 元件准备 四 项目设计 一 原理图设计 二 硬件设计 三 程序设计 五 上机调试 六 知识扫盲 七 项目图片展示 智能门锁 资料链接 智能门锁 rar 2022年1月1日前 单片机设计
  • 机器学习项目入门篇:一个完整的机器学习项目

    本部分 我们会作为被一家地产公司雇佣的数据科学家 完整地学习一个项目 下面是主要步骤 项目概述 获取数据 发现并可视化数据 发现规律 为机器学习算法准备数据 选择模型 进行训练 微调模型 给出解决方案 部署 监控 维护系统 一 项目概述 任
  • 05-Redis

    1 Redis为什么快 1 纯内存操作 2 单线程可以省去多线程时CPU上下文会切换的时间 3 渐进式ReHash 缓存时间戳 数组需要扩容的时候 他会维护两张hash表 比如第一张的数组长度为6 另一张的数组长度为12 在set和get的
  • Android Stuido卡顿解决方法

    修改Android studio的安装目录下bin studio vmoptions和studio64 vmoptions 两个文件的以下属性就可以在内存配置比较大的电脑上有效减少Android Stuido卡顿现象 多开也不怎么卡了 Xm
  • Gate仿真错误Illegal application state /gate/source/addSources ***

    我采用vGate8 2进行仿真 仿真程序是gate GateContrib CT vrt 出现如下错误 Illegal application state source addSources xraygun gt google搜索发现 是I
  • addr2line 定位bug

    addr2line e 文件地址 exe so a 地址 0x
  • Qt 的TCP网络通信

    Qt网络通信 Socket 通信 Qt 中提供的所有的 Socket 类都是非阻塞的 Qt 中常用的用于Socket 通信的套接字类 QTCPServer 用于TCP IP 通信 作为服务器端套接字使用 QTCPSocket 用于TCP I