当前位置: 首页 > news >正文

国庆10.4

QT实现TCP服务器客户端

服务器

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>       //服务器头文件
#include <QTcpSocket>       //客户端头文件
#include <QList>            //链表容器
#include <QMessageBox>      //消息对话框
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_startBtn_clicked();void newConnection_slot();      //自定义处理newConnection信号槽函数的声明void readyRead_slot();          //自定义处理readyRead信号的槽函数的声明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);//实例化一个服务器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();       //获取ui界面上的端口号//监听客户端的连接请求if(!server->listen(QHostAddress::Any, port)){QMessageBox::information(this, "失败", "监听失败");}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_slot);}//readyRead信号对应槽函数的实现
void Widget::readyRead_slot()
{//可以添加提示音qDebug()<<"有新的客户端消息发来了";//遍历客户端链表,将无效的客户端移除for(int i=0; i<clientList.size(); i++){//判断当前套接字是否是有效连接if(clientList[i]->state() == 0){//将该套接字移除客户端容器(链表clientList.removeAt(i);}}//遍历客户端链表,判断是哪个客户端发来的数据for(int i=0; i<clientList.size(); i++){if(clientList[i]->bytesAvailable() != 0){//将该套接字中的数据读取出来QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面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 <QWidget>
#include <QTcpSocket>       //客户端类
#include <QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectBtn_clicked();void connected_slot();      //自定义处理connected信号的槽函数void readyRead_slot();void on_sendBtn_clicked();void on_disconnectBtn_clicked();void disconnected_slot();       //自定义处理disconnected信号的槽函数声明private:Ui::Widget *ui;//定义客户端指针QTcpSocket *socket;//定义字符串接收用户QString userName;};
#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::connected_slot);//如果服务器向客户端发来消息,那么该客户端就会自动发射一个readyRead信号connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);//当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{//获取ui界面上的相关信息userName = ui->userNameEdit->text();        //获取用户名QString ip = ui->ipEdit->text();            //主机地址quint16 port = ui->portEdit->text().toUInt();        //端口号socket->connectToHost(ip, port);
}//处理connected信号的槽函数的定义
void Widget::connected_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());//断开连接socket->disconnectFromHost();}//disconnected信号对应槽函数的定义
void Widget::disconnected_slot()
{QMessageBox::information(this, "提示", "退出成功");
}

现象

相关文章:

国庆10.4

QT实现TCP服务器客户端 服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket> //客户端头文件 #include <QList> //链表容器 #include <QMe…...

2023/8/12 下午8:41:46 树状控件guilite

2023/8/12 下午8:41:46 树状控件guilite 2023/8/12 下午8:42:08 树状控件(Tree View)是一种常见的图形用户界面(GUI)元素,它通常用于显示层次结构数据或文件系统的目录结构。Guilite 是一个轻量级的跨平台 GUI 库,支持多种控件,包括树状控件。 在 Guilite 中使用树状…...

BL808学习日志-2-LVGL for M0 and D0

一、lvgl测试环境 对拿到的M1S_DOCK开发板进行开发板测试&#xff0c;博流的官方SDK是支持M0和D0两个内核都进行测试的&#xff1b;但是目前只实现了M0的LVGLBenchmark&#xff0c;测试D0内核中发现很多莫名其妙的问题。一会详细记录。 使用的是开发板自带的SPI显示屏&#xff…...

treectrl类封装 2023/8/13 下午4:07:35

2023/8/13 下午4:07:35 treectrl类封装 2023/8/13 下午4:07:53 TreeCtrl 类是一个常用的图形用户界面控件,用于实现树形结构的展示和交互。以下是一个简单的 TreeCtrl 类的封装示例: python import wxclass MyTreeCtrl(wx.TreeCtrl):def __init__(self, parent):super()…...

Android学习之路(20) 进程间通信

IPC IPC为 (Inter-Process Communication) 缩写&#xff0c;称为进程间通信或跨进程通信&#xff0c;指两个进程间进行数据交换的过程。安卓中主要采用 Binder 进行进程间通信&#xff0c;当然也支持其他 IPC 方式&#xff0c;如&#xff1a;管道&#xff0c;Socket&#xff0…...

机器学习——KNN算法流程详解(以iris为例)

、 目 录 前情说明 问题陈述 数据说明 KNN算法流程概述 代码实现 运行结果 基于可视化的改进 可视化代码 全部数据可视化总览 分类投票结果 改进后最终代码 前情说明 本书基于《特征工程入门与入门与实践》庄家盛 译版P53页K最近邻&#xff08;KNN&#xff09;算…...

国庆假期day5

作业&#xff1a;请写出七层模型及每一层的功能&#xff0c;请绘制三次握手四次挥手的流程图 1.OSI七层模型&#xff1a; 应用层--------提供函 表示层--------表密缩 会话层--------会话 传输层--------进程的接收和发送 网络层--------寻主机 数据链路层----相邻节点的可靠传…...

ES6中的let、const

let ES6中新增了let命令&#xff0c;用来声明变量&#xff0c;和var类似但是也有一定的区别 1. 块级作用域 只能在当前作用域内使用&#xff0c;各个作用域不能互相使用&#xff0c;否则会报错。 {let a 1;var b 1; } console.log(a); // 会报错 console.log(b); // 1为什…...

Python 列表操作指南3

示例&#xff0c;将新列表中的所有值设置为 ‘hello’&#xff1a; newlist [hello for x in fruits]表达式还可以包含条件&#xff0c;不像筛选器那样&#xff0c;而是作为操纵结果的一种方式&#xff1a; 示例&#xff0c;返回 “orange” 而不是 “banana”&#xff1a; …...

三个要点,掌握Spring Boot单元测试

单元测试是软件开发中不可或缺的重要环节&#xff0c;它用于验证软件中最小可测试单元的准确性。结合运用Spring Boot、JUnit、Mockito和分层架构&#xff0c;开发人员可以更便捷地编写可靠、可测试且高质量的单元测试代码&#xff0c;确保软件的正确性和质量。 一、介绍 本文…...

【nginx】Nginx配置:

文章目录 一、什么是Nginx&#xff1a;二、为什么使用Nginx&#xff1a;三、如何处理请求&#xff1a;四、什么是正向代理和反向代理&#xff1a;五、nginx 启动和关闭&#xff1a;六、目录结构&#xff1a;七、配置文件nginx.conf&#xff1a;八、location&#xff1a;九、单页…...

CSS3与HTML5

box-sizing content-box&#xff1a;默认&#xff0c;宽高包不含边框和内边距 border-box&#xff1a;也叫怪异盒子&#xff0c;宽高包含边框和内边距 动画&#xff1a;移动translate&#xff0c;旋转、transform等等 走马灯&#xff1a;利用动画实现animation&#xff1a;from…...

redis的简单使用

文章目录 环境安装与配置redis发布-订阅相关命令redis发布-订阅的客户端编程redis的订阅发布的例子 环境安装与配置 sudo apt-get install redis-server # ubuntu命令安装redis服务ubuntu通过上面命令安装完redis&#xff0c;会自动启动redis服务&#xff0c;通过ps命令确认&a…...

Windows下启动freeRDP并自适应远端桌面大小

几个二进制文件 xfreerdp # Linux下的&#xff0c;an X11 Remote Desktop Protocol (RDP) client which is part of the FreeRDP project wfreerdp.exe # Windows下的&#xff0c;freerdp2.0 主程序&#xff0c;freerdp3.0将废弃 sdl-freerdp.exe # Windows下的&…...

ES6中的数值扩展

1. 二进制和八进制的表示法 二进制和八进制的前缀分别为0b(或0B)和0o(或0O)表示 在ES5的严格模式下&#xff0c;八进制不再允许使用前缀0表示 如果要将0b和0x前缀的字符串数值转为十进制&#xff0c;要使用Number方法 Number(0b111); // 7 Number(0o10); // 82. Number.isF…...

自定义注解实现Redis分布式锁、手动控制事务和根据异常名字或内容限流的三合一的功能

自定义注解实现Redis分布式锁、手动控制事务和根据异常名字或内容限流的三合一的功能 文章目录 [toc] 1.依赖2.Redisson配置2.1单机模式配置2.2主从模式2.3集群模式2.4哨兵模式 3.实现3.1 RedisConfig3.2 自定义注解IdempotentManualCtrlTransLimiterAnno3.3自定义切面Idempote…...

Linux:minishell

目录 1.实现逻辑 2.代码及效果展示 1.打印字符串提示用户输入指令 2.父进程拆解指令 3.子进程执行指令,父进程等待结果 4.效果 3.实现过程中遇到的问题 1.打印字符串的时候不显示 2.多换了一行 3.cd路径无效 4.优化 1.ll指令 2.给文件或目录加上颜色 代码链接 模…...

STM32驱动步进电机

前言 &#xff08;1&#xff09;本章介绍用stm32驱动42步进电机&#xff0c;将介绍需要准备的硬件器材、所需芯片资源以及怎么编程及源代码等等。 &#xff08;2&#xff09;实验效果&#xff1a;按下按键&#xff0c;步进电机顺时针或逆时针旋转90度。 &#xff08;3&#xff…...

计算机视觉——飞桨深度学习实战-深度学习网络模型

深度学习网络模型的整体架构主要数据集、模型组网以及学习优化过程三部分&#xff0c;本章主要围绕着深度学习网络模型的算法架构、常见模型展开了详细介绍&#xff0c;从经典的深度学习网络模型以CNN、RNN为代表&#xff0c;到为了解决显存不足、实时性不够等问题的轻量化网络…...

用c动态数组(不用c++vector)实现手撸神经网咯230901

用c语言动态数组(不用c++的vector)实现:输入数据inputs = { {1, 1}, {0,0},{1, 0},{0,1} };目标数据targets={0,0,1,1}; 测试数据 inputs22 = { {1, 0}, {1,1},{0,1} }; 构建神经网络,例如:NeuralNetwork nn({ 2, 4,3,1 }); 则网络有四层、输入层2个nodes、输出层1个节点、第…...

SWF逆向工程行业报告:JPEXS Free Flash Decompiler市场份额2025深度分析

SWF逆向工程行业报告&#xff1a;JPEXS Free Flash Decompiler市场份额2025深度分析 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 在Flash技术逐渐退出主流但仍有大量历史资产需要维护…...

Web地图开发避坑指南:墨卡托和UTM坐标系到底怎么选?

Web地图开发坐标系选择指南&#xff1a;墨卡托与UTM的深度对比 当我们打开手机地图应用查看附近餐厅时&#xff0c;很少有人会思考背后复杂的坐标系转换过程。作为一名长期从事WebGIS开发的工程师&#xff0c;我见过太多项目因为坐标系选择不当而导致定位偏移、性能下降甚至数据…...

OpCore-Simplify:如何用四步自动化流程解决黑苹果配置的三大核心挑战

OpCore-Simplify&#xff1a;如何用四步自动化流程解决黑苹果配置的三大核心挑战 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于黑苹果爱好者来说…...

Apache Doris 存储与查询优化实战:从架构设计到性能调优的完整指南

1. Apache Doris 架构设计精要 第一次接触Apache Doris时&#xff0c;我被它简洁的架构设计惊艳到了。这个MPP架构的分析型数据库&#xff0c;用计算存储分离的设计思路&#xff0c;把复杂的大数据分析变得像查普通MySQL表一样简单。FE&#xff08;Frontend&#xff09;和BE&am…...

比迪丽AI绘画创意开发:使用Matlab进行生成效果分析

比迪丽AI绘画创意开发&#xff1a;使用Matlab进行生成效果分析 1. 引言 在AI绘画创作领域&#xff0c;比迪丽模型因其出色的角色生成能力而备受关注。但如何科学评估生成效果、量化分析风格特征&#xff0c;一直是创作者面临的挑战。传统的人工评估方式主观性强、效率低下&am…...

Polars 2.0内存优化实战:如何用lazy().collect()规避OOM,单机处理500GB脏数据?

第一章&#xff1a;Polars 2.0内存优化实战&#xff1a;如何用lazy().collect()规避OOM&#xff0c;单机处理500GB脏数据&#xff1f;在处理超大规模脏数据集时&#xff0c;传统 eager 模式极易触发 OOM&#xff08;Out-of-Memory&#xff09;错误。Polars 2.0 的 LazyFrame 提…...

Untrunc:10倍速视频修复工具,让损坏的MP4/MOV文件起死回生

Untrunc&#xff1a;10倍速视频修复工具&#xff0c;让损坏的MP4/MOV文件起死回生 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾经因为视频文件损坏而失去…...

3步打造开源工具效率引擎:QtScrcpy自定义配置全指南

3步打造开源工具效率引擎&#xff1a;QtScrcpy自定义配置全指南 【免费下载链接】QtScrcpy Android实时投屏软件&#xff0c;此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...

Phi-4-Reasoning-Vision行业落地:工业质检图像逻辑推理与缺陷归因分析

Phi-4-Reasoning-Vision行业落地&#xff1a;工业质检图像逻辑推理与缺陷归因分析 1. 工业质检的智能化升级需求 在现代制造业中&#xff0c;产品质量检测一直是保证产品一致性和可靠性的关键环节。传统工业质检主要依赖人工目检或简单的图像识别算法&#xff0c;存在效率低、…...

双摆控制系统:LQR、LQG、LQI控制器及龙伯格观测器文件清单

移动小车上双摆的LQR、LQG、LQI控制器和龙伯格观测器文件列表&#xff1a; LQG.m LQG_non_linear.m LQI.m LQR.m LQR_Non_linear.m Luenberger_observer.m Observer_non_linear.m 最近蹲在实验室的工位上啃移动小车双摆的控制代码&#xff0c;翻来覆去调了快两周&#xff0c;终…...