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

9月12日的学习

练习

#include "widget.h"
#include "ui_widget.h"
QListWidgetItem *p;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this))//给客户端指针实例化空间及关联父组件
{ui->setupUi(this);//初始化,ui->msg_edit->setEnabled(false);ui->send_btn->setEnabled(false);ui->discon_btn->setEnabled(false);//Aconnect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//如果服务器向客户端发送数据,那么客户端自动发射readyRead()信号//我们就可以将该信号连接到自定义的槽函数中connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);connect(socket,&QTcpSocket::disconnected,this,&Widget::discon_slot);
}Widget::~Widget()
{delete p;p=nullptr;delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_link_btn_clicked()
{//获取ui界面上的IP和端口号QString IP= ui->ip_edit->text();quint16 port=ui->port_edit ->text().toUInt();//让客户端连接服务器//virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);//1、参数1:连接服务器的ip地址//2、参数2:端口号socket->connectToHost(IP,port);//如果客户端成功连接服务器,那么客户端就会自动发射一个connected信号
//  go to A   我们将此信号连接到自定义的槽函数处理逻辑代码,由于只需要连接溢出,所以连接函数写在构造函数、}//连接成功的槽函数
void Widget::connected_slot()
{//告诉服务器 我来了usrname=ui->usr_edit->text();QString msg=usrname + " 进入聊天室";//将信息发送给服务器ui->msg_edit->setEnabled(true);ui->send_btn->setEnabled(true);ui->discon_btn->setEnabled(true);ui->ip_edit->setEnabled(false);ui->port_edit->setEnabled(false);ui->usr_edit->setEnabled(false);ui->link_btn->setEnabled(false);socket->write(msg.toLocal8Bit());}//发送按钮对应的槽函数
void Widget::on_send_btn_clicked()
{//获取ui界面的文本QString msg=usrname +":" +ui->msg_edit->text();//将信息发送给服务器socket->write(msg.toLocal8Bit());//放入ui界面上msg=ui->msg_edit->text()+":" +usrname;p=new QListWidgetItem(msg);p->setTextAlignment(Qt::AlignRight);ui->listWidget->addItem(p);ui->msg_edit->clear();
}//客户端接受处理服务器发来的数据
void Widget::readyRead_slot()
{QByteArray msg  = socket->readAll();//将读取到的信息放入ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));}
//客户端断开连接
void Widget::on_discon_btn_clicked()
{//告诉服务器我走了QString msg=usrname+ "离开聊天室";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();//如果成功与服务器断开连接//那么客户端自动发射disconnected信号//我们就可以将该信号连接到自定义槽函数中处理后续逻辑代码//由于只需要连接一次,所以连接函数写在构造函数 中}void Widget::discon_slot()
{ui->msg_edit->setEnabled(false);ui->send_btn->setEnabled(false);ui->discon_btn->setEnabled(false);ui->ip_edit->setEnabled(true);ui->port_edit->setEnabled(true);ui->usr_edit->setEnabled(true);ui->link_btn->setEnabled(true);
}

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针实例化一片空间,关联父组件,不用担心工程结束释放的问题
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}//启动服务器按钮的槽函数
void Widget::on_start_btn_clicked()
{//获取ui界面端口号quint16 port= ui->port_edit->text().toUInt();//启动服务器//服务器设置监听//bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);//1、参数 1:监听的主机,可以是任意,可以是指定//2、参数2 :监听的端口号//返回值监听成功返回true,监听失败返回falseif(server->listen(QHostAddress::Any,port)){//监听成功QMessageBox::information(this,"","启动服务器成功");ui->start_btn->setEnabled(false);}else{//监听失败QMessageBox::information(this,"","启动服务器失败");return;}//程序运行至此,说明监听成功,如果有客户端发来连接请求,那么服务器就会自动发射一个newConnection信号//我们可以将信号连接到自定义的槽函数中,处理相关逻辑代码connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}void  Widget::newConnection_slot()
{//只要有任意客户端发来连接请求,服务器发送一个newConnnection信号,该槽函数自动响应//获取最新连接客户端的套接字//virtual QTcpSocket *nextPendingConnection();QTcpSocket* s= server->nextPendingConnection();//将客户端套接字放入客户端容器中socketList.push_back(s);//尾插//此时说明客户端和服务器已经建立了连接,如果客户端向服务器发来数据,那么客户端就会自动发射一个readyRead()信号//此时可以将信号连接到自定义的槽函数中,读取客户端的数据connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//
}//readyRead对应的槽函数
void Widget::readyRead_slot()
{//读取客户端的数据//遍历客户端容器,移除无效客户端//元素个数for(int i=0;i<socketList.count();i++){//判断客户端和服务器连接的状态//SocketState state() const;if(socketList.at(i)->state()==0){//未连接,移除socketList.removeAt(i);}}//遍历客户端容器,判断哪个客户端有数据待读for(int i=0;i<socketList.count();i++){//判断哪个客户端有数据可读//qint64 bytesAvailable() const override;//接受数据的字节大小if(socketList.at(i)->bytesAvailable()!=0){//读取数据QByteArray msg  = socketList.at(i)->readLine();//将读取到的数据放入到ui界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));//将数据广播给所有客户端for(int j=0;j<socketList.count();j++){socketList.at(j)->write(msg);}}}
}

相关文章:

9月12日的学习

练习 #include "widget.h" #include "ui_widget.h" QListWidgetItem *p; Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this))//给客户端指针实例化空间及关联父组件 {ui->setupUi(this);//初始化,ui-…...

Java架构师未来篇大模型

目录 1. 大模型的定义2 大模型相关概念区分3 大模型的发展历程4. 大模型的特点5 大模型的分类6 大模型的泛化与微调7 大模型岗位需求8 理解大模型8.1 生活中的比喻8.2 大模型的定义9 大模型工作9.1 数据的积累9.2 模型的训练9.3 预测和应用10 大模型的实际应用10.1 语言处理10.…...

11.5.软件系统分析与设计-面向对象的程序设计与实现

面向对象的程序设计与实现 设计模式 Java代码 C代码...

中电金信:金融级数字底座“源启”:打造新型数字基础设施 筑牢千行百业数字化转型发展基石

近期&#xff0c;金融级数字底座“源启”登录中国电子《最轻大国重器》融媒体报道。从数字底座到数智底座&#xff0c;从金融行业到千行百业&#xff0c;“源启”用数智化转型的中国电子解决方案&#xff0c;为全球企业转型及安全发展提供强大动能。 立足中国电子科技创新成果&…...

IDEA怎么让控制台自动换行

IDEA怎么让控制台自动换行 操作流程 菜单>File>Settings>Editor>General>Console>勾选Use soft wraps in console 换行效果...

大模型笔记02--基于fastgpt和oneapi构建大模型应用平台

大模型笔记02--基于fastgpt和oneapi构建大模型应用平台 介绍部署&测试部署fastgptoneapi服务部署向量模型m3e和nomic-embed-text测试大模型 注意事项说明 介绍 随着大模型的快速发展&#xff0c;众多IT科技厂商都开发训练了各自的大模型&#xff0c;并提供了各具特色的AI产…...

linux-用户与权限管理-组管理

在 Linux 系统中&#xff0c;用户、组与权限管理是保障系统安全的重要机制。用户和组的管理不仅涉及对系统资源的访问控制&#xff0c;还用于权限的分配和共享。组管理在 Linux 中尤其重要&#xff0c;它能够帮助管理员组织用户并为不同的组分配特定权限&#xff0c;从而控制用…...

Day23_0.1基础学习MATLAB学习小技巧总结(23)——句柄图形

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 参考书目&#xff1a;《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是…...

同步io和异步io

同步 I/O 和异步 I/O 是处理输入输出操作的两种不同策略&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。下面是它们的主要区别&#xff1a; 同步 I/O 定义&#xff1a;在同步 I/O 模型中&#xff0c;发起 I/O 操作的线程会被阻塞&#xff0c;直到操作完成。换句话说…...

AI基础 L19 Quantifying Uncertainty and Reasoning with Probabilities I 量化不确定性和概率推理

Acting Under Uncertainty 1 Reasoning Under Uncertainty • Real world problems contain uncertainties due to: — partial observability, — nondeterminism, or — adversaries. • Example of dental diagnosis using propositional logic T oothache ⇒ C av ity • H…...

C++ 关于时间的轮子

时间字符串转chrono::system_clock std::chrono::system_clock::time_point parse_date(const std::string& date_str) {std::tm tm {};std::istringstream ss(date_str);ss >> std::get_time(&tm, "%Y-%m-%d"); // 假设日期字符串格式为YYYY-MM-DDr…...

阿里达摩院:FunASR - onnxruntime 部署

阿里达摩院:FunASR - onnxruntime 部署 git clone https://github.com/alibaba/FunASR.git 切换到 onnxruntime cd FunASR/runtime/onnxruntime1下载 onnxruntime wget https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/dep_libs/onnxruntime-linux-x64-1.14.0.t…...

SpringMvc注解

SpringMvc注解 1 SpringMcv基础环境搭建 注&#xff1a;如果已经有SpringMvc项目直接跳过这个就可以了 1 新建项目 2.修改文件为packaging 为war包 <packaging>war</packaging> <?xml version"1.0" encoding"UTF-8"?> <pr…...

队列的基本概念及顺序实现

队列的基本概念 队列的定义 ​ 队列(Queue)简称队&#xff0c;也是一宗操作受限的线性表&#xff0c;只允许在表的一段进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素成为入队或进队&#xff1b;删除元素成为出队或离队。 ​ 特性&#xff1a;先进先出 (Fir…...

Leetcode 最长连续序列

算法流程&#xff1a; 哈希集合去重&#xff1a; 通过将数组中的所有元素放入 unordered_set&#xff0c;自动去除重复元素。集合的查找操作是 O(1)&#xff0c;这为后续的快速查找提供了保证。 遍历数组&#xff1a; 遍历数组中的每一个元素。对于每个元素&#xff0c;首先检…...

linux网络编程——UDP编程

写在前边 本文是B站up主韦东山的4_8-3.UDP编程示例_哔哩哔哩_bilibili视频的笔记&#xff0c;其中有些部分博主也没有理解&#xff0c;希望各位辩证的看。 UDP协议简介 UDP 是一个简单的面向数据报的运输层协议&#xff0c;在网络中用于处理数据包&#xff0c;是一种无连接的…...

第四部分:1---文件内核对象,文件描述符,输出重定向

目录 struct file内核对象&#xff1a; 如何读写文件&#xff1f; 文件描述符在文件描述符表中的分配规则&#xff1a; 输出重定向初步解析&#xff1a; dup2实现复制文件描述符&#xff1a; struct file内核对象&#xff1a; struct file 是在内核空间中创建的用于描述文…...

如何在开发与生产环境中应用 Flask 进行数据库管理:以 SQLAlchemy 和 Flask-Migrate 为例

在使用 Flask 进行开发时&#xff0c;数据库管理是一个至关重要的环节。借助 SQLAlchemy 作为 ORM&#xff08;对象关系映射&#xff09;工具和 Flask-Migrate 进行数据库迁移&#xff0c;开发者可以高效地进行数据库管理&#xff0c;并在不同的环境&#xff08;如开发环境和生…...

【Java零基础】Java核心知识点之:Map

HashMap(数组链表红黑树) HashMap 根据键的 hashCode 值存储数据&#xff0c;大多数情况下可以直接定位到它的值&#xff0c;因而具有很快的访问速度&#xff0c;但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null&#xff0c;允许多条记录的值为 null。HashMa…...

9.12日常记录

1.extern关键字 1&#xff09;诞生动机:在一个C语言项目中&#xff0c;需要再多个文件中使用同一全局变量或是函数&#xff0c;那么就需要在这些文件中再声明一遍 2&#xff09;用于声明在其他地方定义的一个变量或是函数&#xff0c;在当前位置只是声明&#xff0c;告诉编译器…...

解码 DINO 核心:三大创新如何重塑端到端目标检测

1. 从DETR到DINO&#xff1a;目标检测的范式革命 记得我第一次用Faster R-CNN做目标检测时&#xff0c;光是调整锚框尺寸就花了整整三天。这种传统检测方法就像用老式打字机写代码——每个环节都需要手工微调。直到2020年DETR横空出世&#xff0c;才让我意识到目标检测还能这么…...

Realistic Vision V5.1开源镜像部署教程:Docker+Streamlit一体化环境搭建

Realistic Vision V5.1开源镜像部署教程&#xff1a;DockerStreamlit一体化环境搭建 1. 项目概述 Realistic Vision V5.1是目前SD 1.5生态中最顶级的写实风格模型之一&#xff0c;能够生成媲美专业单反相机拍摄的人像照片。本文将带你从零开始&#xff0c;通过Docker容器和St…...

Kimi-VL-A3B-Thinking Chainlit定制化开发:添加历史记录/多用户会话/图片标注功能

Kimi-VL-A3B-Thinking Chainlit定制化开发&#xff1a;添加历史记录/多用户会话/图片标注功能 1. 项目背景与模型介绍 Kimi-VL-A3B-Thinking是一款基于混合专家架构(MoE)的开源视觉语言模型(VLM)&#xff0c;在多模态推理和长上下文理解方面表现出色。该模型仅激活2.8B参数就…...

RWKV7-1.5B-g1a开源大模型落地:无需高端A100,RTX4090即可跑满多语言生成能力

RWKV7-1.5B-g1a开源大模型落地&#xff1a;无需高端A100&#xff0c;RTX4090即可跑满多语言生成能力 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构的开源多语言文本生成模型&#xff0c;专为实际应用场景优化。这个1.5B参数的模型在保持出色生成能力的同时&#xff0…...

ViGEmBus如何解决Windows游戏控制器兼容性难题?

ViGEmBus如何解决Windows游戏控制器兼容性难题&#xff1f; 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款专业的Windows内核模式驱动程序&a…...

告别复制粘贴!用ABAP类CL_SALV_BS_RUNTIME_INFO自动化获取任意ALV报表数据

告别复制粘贴&#xff01;用ABAP类CL_SALV_BS_RUNTIME_INFO自动化获取任意ALV报表数据 在SAP系统的日常开发中&#xff0c;ABAP程序员经常需要从各种ALV报表中提取数据用于二次处理。传统的手动复制粘贴方式不仅效率低下&#xff0c;还容易出错。本文将介绍如何利用CL_SALV_BS_…...

从实验室到产品:脑机接口(BCI)开发中,EEG实时预处理流程设计与避坑指南

从实验室到产品&#xff1a;脑机接口(BCI)开发中EEG实时预处理流程设计与避坑指南 在咖啡馆见到那位渐冻症患者用脑电波操控机械臂喝咖啡时&#xff0c;我意识到脑机接口技术正从实验室走向真实世界。但鲜有人提及的是&#xff0c;这套酷炫系统背后藏着怎样的信号处理炼狱——当…...

如何智能检测微信单向好友?WechatRealFriends全方位解决方案

如何智能检测微信单向好友&#xff1f;WechatRealFriends全方位解决方案 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFrien…...

OpenClaw内存优化:GLM-4.7-Flash大任务处理的资源调配技巧

OpenClaw内存优化&#xff1a;GLM-4.7-Flash大任务处理的资源调配技巧 1. 当OpenClaw遇上大任务&#xff1a;我的内存崩溃现场 那是个周五的深夜&#xff0c;我正尝试用OpenClaw自动处理一批技术文档的归档和摘要生成。任务看似简单&#xff1a;读取200多个Markdown文件&…...

高效解析快递地址:Java实现智能识别省市区与楼栋单元户室

1. 快递地址解析的痛点与Java解决方案 每天处理成千上万的快递地址是电商和物流企业最头疼的问题之一。我见过太多这样的场景&#xff1a;客服人员手动复制粘贴地址信息&#xff0c;运营团队熬夜整理Excel表格&#xff0c;配送系统因为地址格式混乱而频频出错。这些问题的根源都…...