QT5 TCP网络通讯

  • 服务器与客户端建立连接listen() - connectToHost();  触发newPendingConnect信号
  • 实时数据通讯write(); read();  触发readyRead信号
  • 通讯主要使用的类:
  • QTcpServer  Class

    QTcpServer类提供了一个基于TCP的服务器。
    这个类可以接受传入的TCP连接。您可以指定端口或让QTcpServer自动选择一个端口。您可以收听特定地址或所有机器的地址。
    调用listen()让服务器侦听传入的连接。每次客户端连接到服务器时,都会发出newConnection()信号。

  • QTcpSocket Class

    QTcpSocket类提供了一个TCP套接字。
    TCP(传输控制协议)是一种可靠的,面向流的,面向连接的传输协议。 它特别适合连续传输数据。
    QTcpSocket是QAbstractSocket的一个方便的子类,它允许你建立一个TCP连接并传输数据流。

  • 建立连接:

    服务器端以监听的方式监听客服端是否有连接请求

    客户端以调用connectToHost()函数主动连接服务器端

  • tcp协议服务器端实现流程

    建立服务器对象

    listen服务器, 通过建立的服务器 监听指定地址/端口的客服端;判断是否有客户连接有连接就触发newConnection();

  • 通过connect处理newConnection()信号;
    server = new QTcpServer(this); //建立一个服务器对象
    server->listen(QHostAddress::Any, );//通过建立的服务器监听指定ip地址及端口号的客服端,如不指定端口号,系统会随机分配
    connect(server, QTcpServer::newConnection,
    [=]()
    {
    qDebug() << "有连接进来";
    }
    );

    tcp协议客户端实现流程

    建立QTcpSocket套节字(ip,端口)

    通过套节字connectToHost()函数主动连接服务器;连接成功则触发服务器QTcpServer::newConnection信号;并发送套节字到服务器端;

    关闭连接;

    QTcpSocket Sc(this);
    Sc.connectToHost("127.0.0.1", );//实际代码中参数要进行类型转化
    Sc.close();

    实时通讯:

    • 客户端到服务器端通讯
    1. 当客户端与服务器端建立连接后;
    2. 客户端与服务器端通讯在客户端通过套节字对象调用write()函数发送上传内容;
    3. 服务器端有客户端数据写入时服务器端会自动调用readyread信号
    4. 服务器端在connect中处理readyread信号,并由nextPendingConnection()函数接收客户端发送的套节字;
    5. 服务器端对接收的套节字进行相应处理,即完成一次客户端到服务器端的通讯
    • 服务器端到客户端的通讯
    1. 当客户端与服务器端建立连接后;
    2. 服务器通过套节字对象调用write()函数发送上传内容;客户端会触发readyread信号
    3. 客户端在connect中处理readyread信号

    客户端到服务器端实现代码:

  • 服务器端头文件widget.h
    #ifndef WIDGET_H
    #define WIDGET_H #include <QWidget>
    #include <QTcpServer>
    #include <QTcpSocket>
    namespace Ui {
    class Widget;
    } class Widget : public QWidget
    {
    Q_OBJECT public:
    explicit Widget(QWidget *parent = );
    ~Widget(); private slots:
    void on_buttonsend_clicked(); private:
    Ui::Widget *ui; QTcpServer *server; //建立服务器对象
    QTcpSocket *socket; //套节字对象
    QByteArray tp;   //
    }; #endif // WIDGET_H

    服务器端cpp文件 widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug> Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
    {
    ui->setupUi(this);
    setWindowTitle("服务器");
    tp = nullptr; server = new QTcpServer(this);
    server->listen(QHostAddress::Any, );
    connect(server, QTcpServer::newConnection,
    [=]()
    {
    socket = server->nextPendingConnection();
    connect(socket, &QTcpSocket::readyRead, [=]()
    {
    tp = socket->readAll();
    ui->testdis->append(tp);
    });
    }
    ); } Widget::~Widget()
    {
    delete ui;
    } void Widget::on_buttonsend_clicked()
    {
    socket->write(ui->textEdit->toPlainText().toUtf8());
    }

    客户端头文件socket.h:

    #ifndef SOCKET_H
    #define SOCKET_H #include <QWidget>
    #include <QTcpSocket>
    #include <QHostAddress> namespace Ui {
    class socket;
    } class socket : public QWidget
    {
    Q_OBJECT public:
    explicit socket(QWidget *parent = );
    ~socket(); private slots: void on_buttonLink_clicked(); void on_buttonsend_clicked(); void on_serverclose_clicked(); private:
    Ui::socket *ui; QTcpSocket *sock;
    QHostAddress adrs;
    quint16 port;
    }; #endif // SOCKET_H

    客户端cpp文件socket.cpp

  • #include "socket.h"
    #include "ui_socket.h" socket::socket(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::socket)
    {
    ui->setupUi(this);
    sock = new QTcpSocket(this);
    setWindowTitle("张三");
    connect(sock, &QTcpSocket::readyRead,
    [=]()
    {
    ui->textdis->append(sock->readAll());
    });
    } socket::~socket()
    {
    delete ui;
    } void socket::on_buttonLink_clicked()
    {
    QString ip = ui->serverIP->text();
    QString p = ui->serverPort->text();
    sock->connectToHost(ip, p.toUShort());
    } void socket::on_buttonsend_clicked()
    {
    QString temp = ui->textEdit->toPlainText();
    if(!temp.isEmpty())sock->write(temp.toUtf8());
    } void socket::on_serverclose_clicked()
    {
    sock->close();
    }

    main.cpp文件

    #include "widget.h"
    #include <QApplication>
    #include "socket.h" int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    Widget w;
    w.show();
    socket w1;
    w1.show(); return a.exec();
    }

  • 运行的效果如图所示

  • 后续的通信例子还在学习中,本文的参考链接:

  • (1)https://www.cnblogs.com/flowingwind/p/8348519.html

  • (2)https://www.cnblogs.com/findumars/p/5838531.html
  • (3)https://blog.csdn.net/pk124729136/article/details/8087609

qt5之网络通信的更多相关文章

  1. 分享基于Qt5开发的一款故障波形模拟软件

    背景介绍 这是一款采用Qt5编写的用于生成故障模拟波形的软件.生成的波形数据用于下发到终端机器生成对应的故障类型,用于培训相关设备维护人员的故障排查技能.因此,在这款软件中实现了故障方案管理.故障波形 ...

  2. Qt5.7学习

    一 Qt简介(Build your world with Qt) 二 Qt5.7.0的安装 三 Qt系统构造库及常用类 四 信号(signal)与槽(slot)通信机制 五 QtDesigner开发工 ...

  3. QT5:介绍

    一.简介 QT是一个跨平台的C++开发库,主要用来开发图形用户界面(Graphical User Interface,GUI) QT除了可以绘制漂亮的界面(包括控件/布局/交互),还可以多线程/访问数 ...

  4. QT5利用chromium内核与HTML页面交互

    在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...

  5. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  6. Ubuntu在wps-office等qt5程序下不能切换中文fcitx输入法的问题

    经检查,是缺了fcitx-qt的包.比如qt5的程序,需要一个叫fcitx-libs-qt5的包. 如果您在基于qt的程序下不能使用基于fcitx的中文输入法,请检查以下包是否已安装: sudo ap ...

  7. qt5中文代码编码编译问题

    qt中文代码用vs2010编译问题解决 总结说就是qt5默认UTF8不支持微软默认的ANSI(GB2312/GBK).解决办法是把中文字符串全部用 QString::fromLocal8Bit() 封 ...

  8. VS2010+Qt5.4.0 环境搭建(离线安装)

    原创作者:http://blog.csdn.net/solomon1558/article/details/44084969 前言 因项目需要Qt开发GUI,我根据网上资料及自己的经验整理了搭建vs2 ...

  9. qt5.5程序打包发布以及依赖【转】

    玩qt5也有一段时间了,惭愧的是一直没有好好的发布过程序,因为写的都是小程序没啥需要用到发布,而且qt也说不上很熟悉,本来打算到基本掌握qt之后再来研究研究怎么打包程序,最近晚上的空闲时间多了,闲着也 ...

随机推荐

  1. ESP8266 UDP通信

    #include "driver/uart.h" #include "espconn.h" void ICACHE_FLASH_ATTR user_rf_pre ...

  2. Java虚拟机内存基础、垃圾收集算法及JVM优化

    1 JVM 简单结构图   1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放 ...

  3. maskrcnn-benchmark训练自己数据

    需要修改的地方 1. ./maskrcnn_benchmark/data/datasets/voc.py 将CLASSES 内容改为自己的数据标签 2. ./maskrcnn_benchmark/co ...

  4. STM32——CAN总线波特率和位时序详解

    本人用的单片机是STM32F407,其它型号的单片机类似,可做参考! 一.标准CAN协议位时序概念 由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间 ...

  5. vue-element-admin后台的安装

    # 克隆项目 git clone https://github.com/PanJiaChen/vue-element-admin.git # 进入项目目录 cd vue-element-admin # ...

  6. dao层取值用List<map<String,Object>>接收有序map

    发现一个好玩的Map, 当需要Map有序时用java.util.LinkedHashMap接收,是有序map resultType="java.util.LinkedHashMap" ...

  7. idea 设置Terminal为git终端

  8. SpringMVC问题整理

    JSP页面无法获取ModelAndView里的值 自己搭的项目突然EL表达式取不到值了 不管是用 ${msg} 还是用JSTL的<c:out value="${msg}"/& ...

  9. JavaScript教程——函数(arguments 对象)

    arguments 对象 定义 由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数.这就是arguments对象的由来. arguments对象包含了 ...

  10. Redis持久化(三)

    Redis持久化 Redis提供了哪些持久化机制     1. RDB持久化:     该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘.         2. AOF持久化:     该机制 ...