国庆作业day10.4

news2024/7/4 4:41:01

QT实现TCP服务器客户端搭建的代码,现象

服务器

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化一个服务器
    server=new QTcpServer(this);
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}

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

//启动按钮对应槽函数
void Widget::on_startBtn_clicked()
{
    quint16 port =ui->portEdit->text().toUInt();
    //监听客户端的链接请求
    if(!server->listen(QHostAddress::Any,port))
    {
        QMessageBox::information(this,"失败","监听失败");
        return;
    }else
    {
        QMessageBox::information(this,"成功","服务器启动成功");
    }
    //由于只需要链接一次即可将该链接放在构造函数中
    //函数原型

}
//自定义newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{
    qDebug()<<"您有新的客户端发来链接请求了";
    //获取最新链接的客户端套接字
    QTcpSocket *s= server->nextPendingConnection();
    //将该套接字,放入客户端链表中
    clientList.push_back(s);
    //至此,多个客户端已经跟服务器建立链接,并放入客户端容器中了
    //此时,如果有客户端向服务器发来数
    //我们可以将该信号链接自定义的槽函数中,处理相关逻辑
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_solt);
}
//readyRead对应槽函数
void Widget::readyRead_solt()
{
    qDebug()<<"有新的客户端发来消息了";
    //遍历客户端链表,将无效的客户端移除
    for(int i=0;i<clientList.size();i++)
    {
        //判断当前套接字是否是有效连接
        //函数原型:SockentState state() const;
        //返回0是无效连接
       if( clientList[i]->state()==0)
       {
           //将该无效套接字移除
           clientList.removeAt(i);
       }

    }
    //遍历客户端链表查询是哪个客户端发来的信息
    for(int i=0;i<clientList.size();i++)
    {
        //函数原型
        //功能:求当前客户端套接字中待读数据的字节数
        //返回值0说明无数据可读
        if(clientList[i]->bytesAvailable()!=0)
        {
            //将该套接字中的数据读取出来
            QByteArray msg=clientList[i]->readAll();
            ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
            for(int j=0;j<clientList.size();j++)
            {
                clientList[j]->write(msg);
            }
        }
    }
}
#ifndef WIDGET_H
#define WIDGET_H
#include<QTcpServer>//服务器头文件
#include <QWidget>
#include<QTcpSocket>//客户端头文件
#include<QList> //链表容器
#include<QMessageBox>//消息对话框
#include<QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_startBtn_clicked();
    void newConnection_slot();//自定义处理newconnet槽函数的申明
    void readyRead_solt();

private:
    Ui::Widget *ui;
    //定义服务器指针
    QTcpServer*server;
    //定义客户端容器
    QList<QTcpSocket *>clientList;

};
#endif // WIDGET_H

客户端

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //给客户端指针实例化对象
    socket =new QTcpSocket(this);
    connect(socket,&QTcpSocket::connected,this,&Widget::connect_slot);
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}

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

//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{
    //将客户端连接到给定的服务器
    //1.服务器的主机地址,2端口号
    userName=ui->usernameEdit->text();//用户名
    QString ip=ui->ipEdit->text();//ip
    quint16 port=ui->portEdit->text().toUInt();//端口号
    socket->connectToHost(ip,port);
}
//
void Widget::connect_slot()
{
    QMessageBox::information(this,"成功","您已连接服务器");
    //向服务器发送一条数据:***:进入聊天室
    QString msg=userName+":进入聊天室";
    socket->write(msg.toLocal8Bit());//将数据写给服务器
}
//处理readyRead信号的槽函数的定义
void Widget::readyRead_slot()
{
    //读取套接字中的信息
    QByteArray msg=socket->readAll();
    //将数据展示到ui界面
     ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}

void Widget::on_sendBtn_clicked()
{
    //获取ui界面输入的内容
    QString msg=userName+":"+ui->msgEdit->text();
    socket->write(msg.toLocal8Bit());
    ui->msgEdit->clear();
}
//断开服务器按钮
void Widget::on_disconnectBtn_clicked()
{
    QString msg=userName+":离开聊天室";
    socket->write(msg.toLocal8Bit());
    //断开连接
    //函数原型:virtual void disconnectFromHost()
    //connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
    socket->disconnectFromHost();
}
void  Widget::disconnected_slot()
{
    QMessageBox::information(this,"提示","退出成功");
}
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpSocket>//客户端
#include<QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connectBtn_clicked();
    void connect_slot();
    void readyRead_slot();

    void on_sendBtn_clicked();

    void on_disconnectBtn_clicked();
       void disconnected_slot();

private:
    Ui::Widget *ui;
    //客户端指针
    QTcpSocket * socket;
    //定义字符串接受用户
    QString userName;
};
#endif // WIDGET_H

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

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

相关文章

探秘小米增程汽车与仿生机器人的未来:AI大模型的潜在影响及苹果iPhone15Pro发热问题解决之道

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

智能井盖传感器:城市安全卫士

随着城市人口的不断增加和城市基础设施的不断发展&#xff0c;井盖作为城市道路和排水系统的重要组成部分&#xff0c;承担着确保城市安全和便利性的关键角色。然而&#xff0c;井盖在日常使用中常常面临倾斜、水浸和翻转等问题&#xff0c;这些问题可能导致交通阻塞、行人坠井…

漏洞挖掘--edusrc两连杀

免责声明&#xff1a;文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01; 最近闲来无事&#xff0c;研究了下通达的day&#xff0c;由于本人太菜了&#xff…

软考网络工程师考前如何复习?

先看一下这知识点总结图&#xff0c;在备考复习前大致简单了解一遍&#xff01; 第一步&#xff1a; 通读教程&#xff08;《网络工程师》&#xff09;&#xff0c;首先对教程中的各章节及知识点有一个基本的认识&#xff0c;第一阶段基本以泛读为主&#xff0c;不求立刻记得所…

Maven 配置阿里云镜像

1. 查找maven setting.xml配置文件 find / -name "setting.xml" 2. 添加阿里云镜像 修改maven根目录下的conf文件夹中的setting.xml文件中的mirrors下添加mirror标签 <settings> <localRepository>E:\Maven\repository</localRepository> <…

LLMs Python解释器程序辅助语言模型(PAL)Program-aided language models (PAL)

正如您在本课程早期看到的&#xff0c;LLM执行算术和其他数学运算的能力是有限的。虽然您可以尝试使用链式思维提示来克服这一问题&#xff0c;但它只能帮助您走得更远。即使模型正确地通过了问题的推理&#xff0c;对于较大的数字或复杂的运算&#xff0c;它仍可能在个别数学操…

【Kotlin精简】第2章 集合

1 简介 在 Kotlin 中集合主要分为可变集合与只读集合&#xff0c;其中可变集合使用 “Mutable” 前缀 集合类名表示&#xff0c;比如 MutableList、MutableSet、MutableMap 等。而对于只读集合就是和 Java 中集合类名是一致。 Java 中的 List 非 Kotlin 中的 List , 因为 Kot…

深度学习——权重衰减(weight_decay)

深度学习——权重衰减&#xff08;weight_decay) 文章目录 前言一、权重衰减1.1. 范数与权重衰减1.2. 高维线性回归1.3. 从零开始实现1.3.1.初始化模型参数1.3.2. 定义L₂范数惩罚1.3.3. 定义训练代码实现1.3.4. 不管正则化直接训练1.3.5. 使用权重衰减 1.4. 简洁实现 总结 前言…

寒露到了,冬天还会远吗?

寒露惊秋晚&#xff0c;朝看菊渐黄。 日复一日间&#xff0c;光影如梭&#xff0c;我们便很快将告别了秋高气爽&#xff0c;白日将变得幽晦&#xff0c; 天寒夜长&#xff0c;风气萧索&#xff0c;雾结烟愁。 还没好好体会秋高气爽,寒露就到了。 今天晚上9点多&#xff0c;我们…

成都直播产业未来发展新方向一览,又一大型直播基地入驻成都!

成都直播产业正迎来一股蓬勃发展的新浪潮&#xff0c;展现出无限的潜力和前景。最新消息显示&#xff0c;又一座大型直播基地——成都天府蜂巢直播产业基地即将入驻成都&#xff0c;为这座城市的直播产业注入了新的动力和活力。 天府蜂巢 行业模范 成都天府蜂巢直播产业基地采…

LLMs 入门实战系列

link 【LLMs 入门实战系列】 【LLMs 入门实战系列】交流群 (注&#xff1a;人满 可 添加 小编wx&#xff1a;yzyykm666 加群&#xff01;) 【LLMs 入门实战系列】 第一层 LLMs to Natural Language Processing (NLP) 第一重 ChatGLM-6B 系列 ChatGLM-6BChatGLM2-6B 第十一重 L…

WebSocket ----苍穹外卖day8

介绍 实现步骤 各个模块详解 OnOpen OnOpen:标记一个方法作为处理WebSocket连接打开的方法 当一个客户端与服务器建立 WebSocket 连接时&#xff0c;服务器会接收到一个连接请求。一旦服务器接受了这个连接请求&#xff0c;一个 WebSocket 连接就会被建立。这时&#xff0c;被…

Eclipse iceoryx™ - 真正的零拷贝进程间通信

1 序言 通过一个快速的背景教程&#xff0c;介绍项目范围和安装所需的所有内容以及第一个运行示例。 首先&#xff1a;什么是冰羚&#xff1f; iceoryx是一个用于各种操作系统的进程间通信&#xff08;IPC&#xff09;中间件&#xff08;目前我们支持Linux、macOS、QNX、FreeBS…

一文搞懂频率响应中的相位响应与信号在时域变化的关系

我们知道一个信号通过一个系统后&#xff0c;输出信号的频谱输入信号的频谱*传递函数的频谱 那么衡量输出信号与输入信号的关系通常是考虑他们的幅度和相位。即&#xff1a;传递函数的相位相应和幅度响应。幅度响应好理解&#xff0c;即输出信号相比于输入信号幅值放大多少倍。…

时空智友企业流程化管控系统 sessionid泄露漏洞 复现

文章目录 时空智友企业流程化管控系统 sessionid泄露漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 时空智友企业流程化管控系统 sessionid泄露漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从…

Django开发之初识篇

Django初识篇 前言一、Django 框架介绍二、Django 项目初始化方式一&#xff1a;Windows通过CMD创建并初始化项目方式二&#xff1a;Pycharm 总结 前言 通过Django初识篇、基本篇、进阶篇来学习Django&#xff0c;并能快速开发一个中型的Web网站。 一、Django 框架介绍 Djan…

【IEEE会议征稿】第三届IEEE电气工程与控制科学国际学术会议(IC2ECS 2023)

第三届IEEE电气工程与控制科学国际学术会议&#xff08;IC2ECS 2023&#xff09; 2023 3rd International Conference on Electrical Engineering and Control Science 第三届电气工程与控制科学国际学术会议 (IC2ECS 2023) 定于2023年12月1日在中国杭州召开。会议主要围绕“…

【RHAL】板子烧widevine key

前言&#xff1a;国庆回来工作后很懵逼…又遇见了新问题&#xff0c;因为旧板子烧坏了&#xff0c;新板子系统没带widevine key&#xff0c;我用旧板子命令烧pass&#xff0c;新板子apk烧就fail。 又接触到了新的领域&#xff0c;新名词。不错的&#xff0c;甲方乙方一起带我学…

Flink---13、容错机制(检查点(保存、恢复、算法、配置)、状态一致性、端到端精确一次)

星光下的赶路人star的个人主页 大鹏一日同风起&#xff0c;扶摇直上九万里 文章目录 1、容错机制1.1 检查点&#xff08;CheckPoint&#xff09;1.1.1 检查点的保存1.1.2 从检查点恢复状态1.1.3 检查点算法1.1.3.1 检查点分界线&#xff08;barrier&#xff09;1.1.3.2 分布式快…

elasticsearch基本语法

这里写自定义目录标题 elasticsearch简介基本语法索引创建索引修改索引删除索引 查询简单查询精确查询条件查询范围查询&#xff1a;聚合查询&#xff1a;排序和分页&#xff1a; 参考文献&#xff1a; elasticsearch简介 Elasticsearch 是一个开源的分布式搜索和分析引擎&…