QT---day5,通信

1、思维导图

 2、TCp

服务器
 

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
#include <QTcpServer>
#include <QList>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDebug>
#include <QTcpServer>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
 
class MyWidget : public QWidget
{
    Q_OBJECT
 
public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
 
private slots:
    //void on_pButton_clicked();
 
    void on_startbtn_clicked();
 
    void newConnect_slot();
 
    void readyRead_slot();
 
private:
    Ui::MyWidget *ui;
    QTcpServer *ser;
    QList<QTcpSocket *> cliList;      //客户端容器链表
 
};
#endif // MYWIDGET_H
#include "mywidget.h"
#include "ui_mywidget.h"
 
 
 
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
 
 
    //1、给服务器指针实例化对象
    ser = new QTcpServer(this);
 
 
}
 
 
MyWidget::~MyWidget()
{
    delete ui;
}
 
 
//启动按钮对应的槽函数
void MyWidget::on_startbtn_clicked()
{
    if(ui->startbtn->text() == "启动")
    {
        //获取ui界面上的端口号
        quint16 port = ui->portEdit->text().toUInt();
 
 
 
 
        //启动服务器
        //2、将服务器设置成被动监听状态
        if(ser->listen(QHostAddress::Any, port) == true)
        //参数1:监听的ip地址,如果设置成Any,表示监听所有类型的主机地址,也可以指定特定的主机地址进行监听
        //参数2:端口号,如果设置为0,则让系统自动分配一个端口号,如果使用具体的端口号,则需要指定
        {
            QMessageBox::information(this, "成功", "服务器启动成功");
        }else
        {
            QMessageBox::information(this, "成功", "服务器启动失败");
        }
 
 
        //当启动服务器后,如果有客户端发来连接请求,那么该服务器就会自动发射一个newConnection信号
        //我们可以将该信号,连接到对应的槽函数中处理相关逻辑
        connect(ser, &QTcpServer::newConnection, this, &MyWidget::newConnect_slot);
 
 
 
 
        //将文本内容更改成 关闭
        ui->startbtn->setText("关闭");
    }else
    {
        //关闭服务器
        ser->close();        //关闭监听
 
 
        //将文件内容更改成 启动
        ui->startbtn->setText("启动");
    }
}
 
 
//处理nY
void MyWidget::newConnect_slot()
{
    qDebug () <<"有新客户端发来连接请求了,请尽快处理";
    //获取最新连接的客户端套接字,并将最新连接的套接字地址返回
    QTcpSocket* socket = ser->nextPendingConnection();
 
 
    //将该客户端套接字放入到客户端容器中
    cliList.append(socket);
 
 
    //当有客户端向服务器发来数据时,当前这个客户端套接字就会自动发射一个readyRead信号
    //我们可以将该信号连接到对应的信号处理函数中,处理相关数据
    connect(socket, &QTcpSocket::readyRead, this, &MyWidget::readyRead_slot);
 
 
}
 
 
//关于readyRead信号对应的槽函数的定义
void MyWidget::readyRead_slot()
{
    //判断客户端容器中,是否有已经退出的客户端,或无效的客户端,如果有,将其进行移除
    for(int i=0; i<cliList.length(); i++)
    {
        if(cliList[i]->state() == QTcpSocket::UnconnectedState)
        {//功能:判断当前套接字的状态
           //参数:无
           //返回值:readyRead_slot表示无效的套接字
           cliList.removeAt(i);           //将下标为i的客户端套接字从容器中移除
        }
    }
 
 
    //再将客户端容器遍历一遍,判断哪个客户端中有数据待读
    for(int i=0; i<cliList.length(); i++)
    {
        if(cliList[i]->bytesAvailable() != 0)
        {
            //功能:获取当前套接字中待读数据的个数
            //参数:无
            //返回值:返回套接字中待读数据的个数,如果为0,表示没有数据可读
            //如果不等于0,表示有数据可读,可以使用readAll读取数据
            QByteArray msg = cliList[i]->readAll();
 
 
            //将该消息,展示到ui界面上
            ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
 
 
            //将该消息转发给所有客户端
            for(int j=0; j<cliList.length(); j++)
            {
                if(i!=j)        //不转发给自己
                {
                    cliList[j]->write(msg);
                }
            }
        }
    }
}
 
 

 客户端

 

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
 
class MyWidget : public QWidget
{
    Q_OBJECT
 
public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
 
private slots:
    void on_pushButton_clicked();
    void connnected_slot();
    void readyRead_slot();
 
 
private:
    Ui::MyWidget *ui;
    QTcpSocket *cli;          //定义客户端指针
     QString userName;          //用户名
};
#endif // MYWIDGET_H
 

 

#include "mywidget.h"
#include "ui_mywidget.h"
 
 
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
 
 
    //实例化一个客户端对象
    cli = new QTcpSocket(this);
 
    connect(cli,&QTcpSocket::connected,this,&MyWidget::connnected_slot);
 
    connect(cli,&QTcpSocket::readyRead,this,&MyWidget::readyRead_slot);
 
    //将客户端的connected信号连接到自定义的槽函数中
    connect(cli, &QTcpSocket::connected, this, &MyWidget::connnected_slot);
}
 
MyWidget::~MyWidget()
{
    delete ui;
}
 
 
 
 
 
//连接服务器按钮对应的槽函数
void MyWidget::on_pushButton_clicked()
{
    if(ui->intobtn->text() == "连接服务器")
    {
        //执行连接服务器的工作
        //获取ui界面上的数据
        userName = ui->userNameEdit->text();         //用户名
        QString ip = ui->ipEdit_2->text();            //ip地址
        quint16 port = ui->portEdit->text().toUInt();   //端口号
 
 
        //向服务器发送连接请求
        cli->connectToHost(ip, port);
        //功能:向指定的服务器发送连接请求
        //参数1:服务器ip地址
        //参数2:服务器端口号
 
 
        //当成功连接服务器后,当前客户端会自动发射一个connected的信号,我们可以将该信号连接到对应的槽函数中处理逻辑
        //由于该操作只需进行一次即可,所以写在构造函数中即可
 
 
        //将按钮内容更成 断开服务器
        ui->intobtn->setText("断开服务器");
    }else
    {
 
       QString msg = userName+":离开聊天室";
       cli->write(msg.toLocal8Bit());
 
        //执行断开服务器工作
        cli->disconnectFromHost();
 
        //将按钮内容更改成 连接服务器
         ui->intobtn->setText("连接服务器");
    }
}
 
//处理readyRead信号对应的槽函数的是实现
void MyWidget::readyRead_slot()
{
    QByteArray msg =cli->readAll();
 
    ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}
 
//自定义处理connnected信号的槽函数的实现
void MyWidget::connnected_slot()
{
    QMessageBox::information(this, "连接", "连接服务器成功!!!");
}
 

 

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

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

相关文章

镭速实现利用Libarchive实现高效、智能的文件传输和管理

在前一篇报道中&#xff0c;我们阐述了Libarchive这一开源库的强大功能&#xff0c;它专门用于处理归档文件。通过整合Libarchive&#xff0c;镭速在包括Windows和Linux在内的多个操作系统上提供了在线解压缩服务&#xff0c;为企业构建了一个既强大又安全的文件传输系统&#…

【代码分享】使用HTML5的Canvas绘制编码说明图片

最急在工作中遇到一个需求&#xff0c;根据给定的编码生成编码说明&#xff0c;像下面这样的效果。 不同含义的编码用横杠分割&#xff0c;然后每个编码下面用箭头指明具体的含义。下面是我使用canvas实现的代码。具体的编码宽度大家可以根据实际情况进行调整&#xff0c;目前…

Ranger 面试题及答案整理,最新面试题

Ranger 的安全模型是如何设计的&#xff1f; Ranger的安全模型设计主要基于访问控制和安全策略的管理&#xff0c;它通过以下几个关键组件实现&#xff1a; 1、策略管理&#xff1a; Ranger 提供了一个中央管理平台&#xff0c;用于定义、更新和管理安全策略。这些策略根据资…

基于RT-Thread的HC-SR04超声波驱动

前言 本次驱动用的是这款超声波&#xff0c;超声波的驱动大同小异&#xff0c;均可参考 一、引脚定义 引脚功能VCC接直流5V电TRIG接外部电路的TRIG端&#xff0c;向此引脚输入10us以上的高电平可触发超声波测距ECHO接外部电路的ECHO端&#xff0c;测距结束时该引脚会输出一…

Python框架Django入门教程

Django 是一个使用 Python 编程语言开发的、免费且开源的 Web 应用框架。它遵循 "DRY&#xff08;Dont Repeat Yourself&#xff09;" 原则&#xff0c;旨在简化创建功能丰富的、高效率的 Web 网站。Django 提供了模型-视图-控制器&#xff08;MVC&#xff09;架构的…

时尚圈的节制美学 — 奥柔拉 AVRALA的独特设计理念

在这个多元化的时代&#xff0c;女性正在经历一场前所未有的角色变革。她们不再仅仅满足于传统的社会角色&#xff0c;而是勇敢地追求个人职业发展和自我实现。在这样的背景下&#xff0c;服饰不仅仅是外在的装饰&#xff0c;更是内心故事的讲述者、个性自我的表达者、身份归属…

NX/UG二次开发—3D几何—多边形内部最大圆

多边形内部最大圆&#xff0c;为什么不能说最大内切圆&#xff1f;如果正方形或正凸多边形&#xff0c;最大内部圆是与边相切的&#xff0c;但对于不规则多边形&#xff0c;很多情况是正好经过一些凹点。 本次介绍在NX中计算封闭边界内部最大圆&#xff1a; 1、首先按顺序排序…

Spring、SpringMVC

一、Spring框架中的单例Bean是线程安全的吗&#xff1f; 【默认单例的情况下】Spring Bean并没有可变的状态&#xff08;如Service类和DAO类&#xff09;&#xff0c;即只能查不能改&#xff0c;所以没有并发问题&#xff0c;所以某种程度上来说Spring的单例Bean是线程安全的。…

【ZZULI数据结构实验】压缩与解码的钥匙:赫夫曼编码应用

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

前端工程化之包管理器

这里写目录标题 什么是包包管理工具常用的包管理工具npmnpm 基本使用初始化搜索工具包下载安装包导入 npm 包基本流程生产依赖与开发依赖全局安装安装全部依赖安装指定版本的包删除依赖包 cnpm全局安装nrm 的使用 yarn全局安装yarn 常用命令 pnpm 【推荐使用】全局安装 什么是包…

我国吻合器市场规模不断扩大 国产化率有所增长

我国吻合器市场规模不断扩大 国产化率有所增长 吻合器是替代手工切除或缝合的一种医疗器械&#xff0c;其工作原理与订书机十分相似&#xff0c;可利用钛钉对组织进行离断或吻合。经过多年发展&#xff0c;吻合器种类逐渐增多&#xff0c;根据手术方式不同&#xff0c;吻合器大…

【JavaEE 初阶(三)】多线程代码案例

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.单例模式2.1饿汉方式2.2饿汉方式 3.阻塞队列3.1概念3.2实现 4.定时器4.1概念4.…

支付宝小程序如何去除页面下拉回弹

描述&#xff1a;支付宝小程序页面下拉时会产生回弹&#xff0c;如果页面上有拖拽功能&#xff0c;会有影响 解决方法&#xff1a; 页面xx.config.js中设置&#xff1a;allowsBounceVertical: “NO” 官方文档&#xff1a;https://opensupport.alipay.com/support/FAQ/7110b5d…

WT32-ETH01作为TCP Client进行通讯

目录 模块简介WT32-ETH01作为TCP Client设置电脑作为TCP Server设置连接并进行通讯总结 模块简介 WT32-ETH01网关主要功能特点: 采用双核Xtensa⑧32-bit LX6 MCU.集成SPI flash 32Mbit\ SRAM 520KB 支持TCP Server. TCP Client, UDP Server. UDP Client工作模式 支持串口、wif…

鸿蒙OpenHarmony技术:【Docker编译环境】

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

uni-app+vue3 +uni.connectSocket 使用websocket

前言 最近在uni-appvue3websocket实现聊天功能&#xff0c;在使用websocket还是遇到很多问题 这次因为是app手机应用&#xff0c;就没有使用websocket对象&#xff0c;使用的是uni-app的uni.connectSocket 为了方便测试这次用的是node.js一个简单的dom&#xff0c;来联调模拟…

Apache Flume Agent内部原理

Apache Flume Agent内部原理 Apache Flume 是一个可扩展的、分布式的日志收集、聚合和传输系统。在 Flume 中&#xff0c;Agent 是一个独立的进程&#xff0c;负责接收、传输和处理数据。Agent 内部包含多个组件&#xff0c;每个组件都有不同的功能和责任。 1. Source&#xff…

三下乡社会实践投稿攻略在这里

在当今信息爆炸的时代&#xff0c;如何让自己的声音被更多人听到&#xff0c;成为许多人和企业所关心的问题。其中&#xff0c;向各大媒体网站投稿&#xff0c;成为了一种常见的宣传方式。但是&#xff0c;如何投稿各大媒体网站&#xff1f;新闻媒体发文策略又有哪些呢&#xf…

光耦推荐—高速风筒方案中用到哪些光耦型号

高速风筒是现代生活中常见的电器设备&#xff0c;广泛应用于家庭、商业和工业领域&#xff1b;光耦是一种能够将输入信号转换成输出信号的元器件&#xff0c;其作用在于将电气信号转换成光信号&#xff0c;从而实现电路的隔离和保护&#xff1b;采用光耦可实现对风机转速和温度…