Qt中的QTcpSocket、QWebSocket和QLocalSocket

news2025/8/3 9:53:20

在这里插入图片描述
同时实现了QTcpSocket、QWebSocket和QLocalSocket的简单通讯deamon,支持自动获取本机ip,多个客户端交互。在这个基础上你可以自己加错误检测、心跳发送、包封装解析和客户端自动重连等功能。

获取本机电脑ip:

QString Widget::getIp()
{
    QString hostName=QHostInfo::localHostName();//主机信息查询:返回本机主机名
    QHostInfo  hostInfo=QHostInfo::fromName(hostName);//通过主机名称,获取IP地址,返回一个hostInfo类
    QString    localIP="";//本地IP地址string数组
    QList<QHostAddress> addList=hostInfo.addresses();//创建一个QList对象,容器内部存储QHostAddress类型的数据,返回一个address数组,QHostAddress类提供一个IP地址的信息,包括IPv4和Ipv

    if (!addList.isEmpty())
    {
        for (int i=0;i<addList.count();i++)
        {
            QHostAddress aHost=addList.at(i);//访问指定位置的元素
            //测试
            //qDebug()<<aHost.toString();
            if (QAbstractSocket::IPv4Protocol==aHost.protocol())  //protocol()返回IP地址的协议类型,并且只返回IPv4的地址
            {
                localIP=aHost.toString();//返回IP地址的字符串
                break;
            }
        }
    }
    qDebug()<<localIP;
    return localIP;
}

tcp服务器连接介绍:
1、定义并创建接收的信号与槽:

//创建tcp服务器对象
m_tcpServer = new QTcpServer(this);
//捕获客户端连接
connect(m_tcpServer,SIGNAL(newConnection()),this,SLOT(slottcpNewConnection()));

2、开启监听ip和端口

m_tcpServer->listen(QHostAddress(ui->tcpip->text()),ui->tcpport->text().toInt());

3、接入连接进来的客户端,并配置接收。

    //获取新的连接对象
    QTcpSocket *tcpSocket = m_tcpServer->nextPendingConnection();

    //捕获客户端发送数据的信号
    connect(tcpSocket,&QTcpSocket::readyRead,this,[&]()
    {
        QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
        QString val = socket->readAll();
    });
    //捕获客户端断开的信号
    connect(tcpSocket,&QTcpSocket::disconnected,this,[=]()
    {
    });
}

4、发送数据

  tcpSocket->write(ui->tcpsendedit->text().toLatin1());

tcp客户端连接流程
1、定义并连接ip和端口

    m_tcpSocket = new QTcpSocket(this);
    m_tcpSocket->connectToHost(QHostAddress(ui->tcpip->text()),ui->tcpport->text().toInt());

2、绑定连接、断开连接和接收的信号与槽

    connect(m_tcpSocket,&QTcpSocket::connected,this,[=]()
    {
    });
    connect(m_tcpSocket,&QTcpSocket::disconnected,this,[=]()
    {
    });
    connect(m_tcpSocket,&QTcpSocket::readyRead,this,&Widget::slotTcpReadData);

3、发送

    m_tcpSocket->write(ui->tcpsendedit->text().toLatin1());

websocket服务器连接流程
1、定义并创建接收的信号与槽:

    //使用给定的serverName构造一个新的QWebSocketServer。该服务器名称将在HTTP握手阶段被用来识别服务器。它可以为空,此时不会将服务器名称发送给客户端。
    //SslMode指示服务器是通过wss(SecureMode)还是ws(NonSecureMode)运行。QWebSocketServer::SecureMode服务器以安全模式运行(通过wss);QWebSocketServer::NonSecureMode服务器以非安全模式运行(通过ws)
    m_webServer = new QWebSocketServer("",QWebSocketServer::NonSecureMode,this);
    connect(m_webServer,SIGNAL(newConnection()),this,SLOT(slotWebNewConnect()));

2、开启监听ip和端口

    m_webServer->listen(QHostAddress(ui->webip->text()),ui->webport->text().toInt());

3、接入连接进来的客户端,并配置接收。

   QWebSocket* webSocket = m_webServer->nextPendingConnection();
    connect(webSocket,&QWebSocket::disconnected,this,[=]()
    {
    });
    connect(webSocket,&QWebSocket::textMessageReceived,this,[=](QString val)
    {
    });

4、发送数据

    webSocket>sendTextMessage(ui->websendedit->text());//sendBinaryMessage发送二进制数据。

websocket客户端连接流程
1、定义并连接ip和端口

    m_webSocket = new QWebSocket("");
    m_webSocket->open(QUrl(QString("ws://%1:%2").arg(ui->webip->text()).arg(ui->webport->text())));

2、绑定连接、断开连接和接收的信号与槽

    connect(m_webSocket,&QWebSocket::connected,this,[=]()
    {
    });
    connect(m_webSocket,&QWebSocket::disconnected,this,[=]()
    {
    });
    connect(m_webSocket,&QWebSocket::textMessageReceived,this,&Widget::slotwebReadData);

3、发送

    m_webSocket->sendTextMessage(ui->websendedit->text());//sendBinaryMessage发送二进制数据。

本地通信服务器连接流程
1、定义并创建接收的信号与槽:

    //创建本地服务器对象
    m_localServer = new QLocalServer(this);
    //捕获客户端连接
    connect(m_localServer,SIGNAL(newConnection()),this,SLOT(slotlocalnewConnection()));

2、开启监听key值

    QLocalServer::removeServer(m_oldKey);    //删除已有的连接
    m_localServer->listen(ui->localkey->text());              //监听客户端
    m_oldKey = ui->localkey->text();

3、接入连接进来的客户端,并配置接收。

    if (m_localServer->hasPendingConnections())
    {
        //获取新的连接对象
        QLocalSocket* localSocket = m_localServer->nextPendingConnection();

        //捕获客户端发送数据的信号
        connect(localSocket,&QLocalSocket::readyRead,this,[&]()
        {
            QLocalSocket* socket = qobject_cast<QLocalSocket*>(sender());
            QString val = socket->readAll();
        });
        //捕获客户端断开的信号
        connect(localSocket,&QLocalSocket::disconnected,this,[=]()
        {
        });
    }

4、发送

   localSocket->write(ui->tcpsendedit->text().toLatin1());

本地通信客户端连接流程
1、定义并连接key值

    m_localSocket = new QLocalSocket(this);
    m_localSocket->connectToServer(ui->localkey->text(),QIODevice::ReadWrite);

2、绑定连接、断开连接和接收的信号与槽

    connect(m_localSocket,&QLocalSocket::connected,this,[=]()
    {
    });
    connect(m_localSocket,&QLocalSocket::disconnected,this,[=]()
    {
    });
    connect(m_localSocket,&QLocalSocket::readyRead,this,&Widget::slotlocalReadData);

3、发送

    m_localSocket->write(ui->localsendedit->text().toLatin1());

完整示例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

simulink stateflow 状态机

系列文章目录 文章目录系列文章目录前言一、基操二、stateflow 数据三、chart动作四、chart的执行五、flow chart / junction六、状态机中的函数 Stateflow Functions七、chart层次结构八、案例——吸尘器机器人的驱动模式前言 一、基操 在tooltrip中选择DEBUG&#xff0c;通过…

Tomcat+IDEA+Servlet能显示页面但提交form表单出现404问题

问题&#xff1a; 当我们使用tomcat启动&#xff0c;然后输入对应的url路径时候&#xff0c;能出现该html的页面&#xff0c;但提交表单后&#xff0c;却出现了404的问题&#xff0c;这时候我就很疑惑了....然后开始慢慢分析。 思路&#xff1a; 首先我们得知道404状态码是什…

ISFP型人格的优势和劣势分析(mbti性格测试)

isfp型人格的优势分析ISFP在艺术上具有令人惊叹的天分&#xff0c;他们充沛且敏锐的情感能够轻易捕捉到那些细腻的情感变化。他们具有强大的表现力和感染力&#xff0c;能够通过自己的作品&#xff0c;将情感描绘出来并令观众感同身受&#xff0c;这使得他们在艺术和人文领域能…

为什么会出现植物神经紊乱 总是检查不出来该怎么办

植物神经紊乱是一种很多人都害怕的疾病&#xff0c;你们知道是为什么吗&#xff1f; 植物神经紊乱是一种神经系统失调导致的多种症状的总称&#xff0c;这种疾病是由于社会因素所诱发的脏器功能的失调&#xff0c;是一种非常复杂的疾病。而这种疾病是可能会发生在任何年龄阶段的…

vulnhub靶场实战系列(一)之vulnhub靶场介绍

vulnhub靶场介绍 Vulnhub是一个提供各种漏洞环境的靶场平台&#xff0c;供安全爱好者学习渗透使用&#xff0c;大部分环境是做好的虚拟机镜像文件&#xff0c;镜像预先设计了多种漏洞&#xff0c;需要使用VMware或者VirtualBox运行。每个镜像会有破解的目标&#xff0c;大多是…

关于 interface{} 会有啥注意事项?下

我们一起来回顾一下上一次说到的 interface{} 可以用来做多态 接口类型分为空接口类型和非空接口类型&#xff0c;他们的底层数据结构不太一样 这里顺便说一下&#xff0c;用来作态需要满足这样的条件&#xff1a; 首先得有父类指针指向子类的对象这个接口还必须是非空接口…

【软件逆向】软件破解?病毒木马?游戏外挂?

文章目录课前闲聊认识CTF什么是CTFCTF解题模式什么是逆向定义应用领域CTF中的逆向现状推荐书籍学习要点逆向工程学习基础常规逆向流程阶段一:信息收集阶段二:过保护后静态调试阶段三:结合动态调试阶段四:写解题脚本逆向例题概览1-控制台程序解题过程2-Crackme3-游戏4-移动安全C…

每天学一点之多线程

多线程 一、相关概念 并发与并行 并行&#xff08;parallel&#xff09;&#xff1a;指多个事件任务在同一时刻发生&#xff08;同时发生&#xff09;。 并发&#xff08;concurrency&#xff09;&#xff1a;指两个或多个事件在同一个微小的时间段内发生。程序并发执行可以…

steam/csgo搬砖项目到底真的假的?

搬砖是从国外steam市场置办游戏装备回来&#xff0c;在国内网易buff售卖&#xff0c;低买高卖&#xff0c;产生利润的一个项目。 但我真正上手后&#xff0c;才知道steam是面向全球的游戏平台&#xff0c;用户真的大的夸张&#xff01;&#xff01;市场非常巨大&#xff0c;一…

物联网毕设 -- 智能厨房监测系统(改)

前言 在家庭生活中&#xff0c;厨房是必不可少的&#xff0c;所以厨房的安全问题关乎着我们大家的生命&#xff0c;所以提出智能厨房监测系统&#xff0c;目的就是为我们减少不必要的安全问题 ⚠️⚠️&#xff08;本文章仅提供思路和实现方法&#xff0c;并不包含代码&#x…

雷电模拟器安卓7以上+Charles抓包APP最新教程

一、工具准备&#xff1a; 证书安装工具全局代理工具下载&#xff1a; https://download.csdn.net/download/weixin_51111267/87536481 二、Charles设置 &#xff08;一&#xff09;电脑上证书安装 &#xff08;二&#xff09;安卓模拟器上系统证书安装&#xff08;RooT权限打…

wireshark 抓包使用记录

文章目录前言wireshark 抓包使用记录一、wireshark的基础使用二、wireshark的常用功能1、开始混杂模式2、过滤器操作2.1、抓包过滤器2.2、显示过滤器3、时间格式显示4、统计流量图5、标记显示6、导出数据包7、增加、隐藏、删除显示列前言 如果您觉得有用的话&#xff0c;记得给…

体验Linux USB 驱动

目录 一、USB OTG 二、I.MX6ULL USB 接口简介 硬件原理图 1、USB HUB 原理图 2 、USB OTG 原理图 三、使能驱动 1、打开 HID 驱动 2、 使能 USB 键盘和鼠标驱动 3 、使能 Linux 内核中的 SCSI 协议 4、使能 U 盘驱动 四、测试u盘 五、 Linux 内核自带 USB OTG USB 是…

vue3常用的API

目录 1.ref函数 2.reactive函数 3.reactive对比ref 4.computed函数 5.watch函数 6.toRef 7..provide && inject 1.ref函数 作用: 定义一个响应式的数据 语法: const xxx ref(initValue) 创建一个包含响应式数据的引用对象&#xff08;reference对象&#xff…

MySQL数据库基本操作

DDL 1、DDL解释 DDL(Data Definition Language)&#xff0c;数据定义语言&#xff0c;该语言部分包括以下内容&#xff1a; 对数据库的常用操作 对表结构的常用操作 修改表结构1、对数据库的常用操作 2、对表结构的常用操作-创建表 创建表格式 3、对表结构的常用操作-创建表…

Springboot——@valid 做字段校验和自定义注解

文章目录前言注意实现测试环境验证自带的注解自定义valid注解自定义注解和处理类创建参数接收类&#xff0c;并增加字段注解接口中使用自测环节正常测试异常测试自定义全局异常监听扩展递归参数下valid不识别的坑前言 再项目开发中&#xff0c;针对前端传递的参数信息&#xf…

机器学习中的数学——精确率与召回率

在Yolov5训练完之后会有很多图片&#xff0c;它们的具体含义是什么呢&#xff1f; 通过这篇博客&#xff0c;你将清晰的明白什么是精确率、召回率。这个专栏名为白话机器学习中数学学习笔记&#xff0c;主要是用来分享一下我在 机器学习中的学习笔记及一些感悟&#xff0c;也希…

Java开发 - Redis初体验

前言 es我们已经在前文中有所了解&#xff0c;和es有相似功能的是Redis&#xff0c;他们都不是纯粹的数据库。两者使用场景也是存在一定的差异的&#xff0c;本文目的并不重点说明他们之间的差异&#xff0c;但会简要说明&#xff0c;重点还是在对Redis的了解和学习上。学完本…

Lab2_Simple Shell_2020

Lab2: 实验目的&#xff1a;给xv6添加新的系统调用 并理解系统调用是如何工作的&#xff0c;并理解xv6内核的一些内部特征 实验准备&#xff1a; 阅读xv6的第2章以及第4章的4.3,4.3小节熟悉下面的源码 用户态相关的代码&#xff1a;user/user.h和user/usys.pl内核态相关的代…

第八章:枚举类与注解

第八章&#xff1a;枚举类与注解 8.1&#xff1a;枚举类的使用 ​ 类的对象只有有限个&#xff0c;确定的。我们称此类为枚举类。当需要定义一组常量是&#xff0c;强烈建议使用枚举类。如果枚举类中只有一个对象&#xff0c;则可以作为单例模式的实现方式。 如何定义枚举类 …