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. WinPE基础知识之头部

    1.DOS头 // DOS MZ头,大小为64个字节 typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // EXE标志,“MZ”(有用,解析时作为是否 ...

  2. 7.SpringMVC 配置式开发-ModelAndView和视图解析器

    ModelAndView 1.Model(模型) 1.model的本质就是HashMap,向模型中添加数据,就是往HashMap中去添加数据 2.HashMap 是一个单向查找数组,单向链表数组 3. ...

  3. CHD-5.3.6集群上hive安装

    解压过后: [hadoop@master CDH5.3.6]$ ls -rlttotal 8drwxr-xr-x. 17 hadoop hadoop 4096 Jun  2 16:07 hadoop- ...

  4. TCP-HTTP ___UDP 应用场景

    UDP 套接字应用之广播 import socket,threading #创建套接字 s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 设置套接 ...

  5. 小程序Flex布局

    容器属性 容器支持的属性有:display:通过设置display属性,指定元素是否为Flex布局.flex-direction:指定主轴方向,决定了项目的排列方式.flex-wrap:排列换行设置. ...

  6. php连接oracle oracle开启扩展

    <?php /** * 由于公司的需要,使用php+oracle开发项目,oracle因为有专门人员开发设计,我们只需远程调用 *于是乎遇到了蛋疼的问题就是开启oracle扩展的问题,虽然你在p ...

  7. python改成了python3的版本,那么这时候yum就出问题了

    既然把默认python改成了python3的版本,那么这时候yum就出问题了,因为yum貌似不支持python3,开发了这个命令的老哥也不打算继续写支持python3的版本了,所以,如果和python ...

  8. struts2之关联查询(5)

    需要关联四个表 select g.*,b.name brname,s.bid,s.sname,bi.name biname  from T_GOODS g left join T_brand b on ...

  9. Unity 截图选择框,中间全透明,边缘半透明

    效果:点击白色框可拖拽选择区域 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; u ...

  10. 【git】git中使用https和ssh协议的区别以及它们的用法

    git可以使用四种主要的协议来传输资料: 本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 git 协议.其中,本地协议由于目前大都是进行远程开发和共享代码所以一般不常 ...