qt服务器 网络聊天室

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给服务器指针实例化空间server = new QTcpServer(this);
}Widget::~Widget()
{delete ui;
}//启动服务器按钮对应的槽函数
void Widget::on_startBtn_clicked()
{//获取ui界面上的端口号quint16 port = ui->portEdit->text().toUInt();//将服务器设置为监听状态//bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);//功能:监听客户端发来的连接请求//参数1:要坚听的主机地址,any表示监听任意主机地址,也可以给定特定主机地址//参数2:提供的端口号,如果时0,表示让系统自动分配端口号//返回值:bool,成功监听返回true,失败返回falseif (server->listen(QHostAddress::Any, port)){QMessageBox::information(this, "", "服务器启动成功");}else{QMessageBox::information(this, "", "服务器启动失败");}//此时服务器已经进入监听状态,如果有客户端发来连接请求,那么该服务器就会自动发射一个newConnection信号//可以将该信号连接到自定义的槽函数中处理心连接的套接字connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);}//处理newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{qDebug() << "有新客户端发来连接";//获取最新连接的客户端套接字//函数原型: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++){//        socketList.at(i)->state();  //任意一个客户端的状态//函数原型:SocketState state() const;//功能:返回套接字状态//参数:无//返回值:套接字状态,是个枚举值,如果是0,表示无效连接if (socketList.at(i)->state() == 0){//移除该客户端socketList.removeAt(i);     //将下标为i的套接字从链表中移除}}//遍历客户端套接字去寻找哪个客户端有数据待读for (int i = 0; socketList.count(); i++){//判断当前套接字是否有数据待读//函数原型:qint64 bytesAvailable() const override;//功能:求出当前套接字待读数据的个数//参数:无//返回值:待读数据的个数if (socketList.at(i)->bytesAvailable() != 0){//说明当前套接字中有数据//读取当前套接字中的数据//函数原型:QByteArray readAll();//功能:读取套接字中所有数据//参数:无//返回值:QByteArray读取下来的数据QByteArray msg = socketList.at(i)->readAll();//将数据展示到界面ui->msgWidget->addItem(QString::fromLocal8Bit(msg));//将数据发送给所有客户端for (int j = 0; j < socketList.count(); j++){//将数据写入到所有客户端套接字中socketList.at(j)->write(msg);}}}
}

 

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

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

相关文章

暴力猴插件简明开发教程->百度首页默认设置为我的关注

文章目录 暴力猴插件开发简明教程->百度首页默认设置为我的关注缘起缘灭思路实现尾声 暴力猴插件开发简明教程->百度首页默认设置为我的关注 缘起 在我的百度首页有很多自己设置的导航链接(接近100个),里面放了我常用的网站, 如下图 但是最近一段时间, 我发现百度做了一…

智能合约安全审计

智能合约安全审计的意义 智能合约审计用于整个 DeFi 生态系统&#xff0c;通过对协议代码的深入审查&#xff0c;可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点&#xff0c;这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用…

【牛客面试必刷TOP101】Day1.反转链表和合并两个排序的链表

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

详细分析Python中运算符“==“和“is“的区别

目录 Python中运算符"" Python中运算符"is" ""和"is"的区别 总结 Python中运算符"" 在Python中&#xff0c;双等号运算符"" 用于比较两个值是否相等。它返回一个布尔值&#xff0c;即True或False&#xff0c;…

C# 使用opencv从图片识别人脸示例

1.用chatgpt帮我写了一个示例 using System; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure;class Program {static void Main(string[] args){// 加载人脸分类器CascadeClassifier faceCascade new CascadeClassifier("haarcascade_frontalface_defau…

JenKins工作流程

程序员提交代码到Git/SVN仓库&#xff0c;触发钩子程序向 JenKins 进行通知&#xff0c;Jenkins 调用Git/SVN插件获取源码&#xff0c;调用Maven打包为war包&#xff0c;调用Deploy to web container插件部署到Tomcat服务器。

Redis哨兵模式

Redis哨兵模式 一、服务器准备二、安装redis1.Master服务器2.SlaveFirst服务器3.SlaveSecond服务器 三、依次开启Redis服务器四、开启哨兵1.修改Master哨兵配置文件2.修改SlaveFirst哨兵配置文件3.修改SlaveSecond哨兵配置文件4.开启哨兵5.验证是否开启成功6.主从配置如下五、挂…

【替换】批量替换命令文件名称或者文件内容

你是否困扰过&#xff0c;每次文件F2进行修改&#xff0c;十几个没关系&#xff0c;百来个写代码麻烦&#xff0c;那就使用shell命令吧 执行语句 先养成习惯查询验证&#xff0c;因为是批量替换&#xff0c;为了防止全局替换嘎嘎叫 替换文件名 # 【习惯】先使用顾虑查询&…

最新基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

收藏这11个插画网站,插画师必备!

无论是在哪种设计工作中&#xff0c;插画素材都是比较常用的素材。今天本文整理了11个好用的插画工具&#xff0c;能帮助设计师轻松绘制出插画&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款国产的&#xff0c;省心省力的插画工具。它为设计师提供了简单易…

python实现某品牌数据采集

某品牌数据采集 采集需求 地址&#xff1a;http://www.winshangdata.com/brandList 需求&#xff1a;用scrapy框架采集本站数据&#xff0c;至少抓取5个分类&#xff0c;数据量要求5000以上 采集字段&#xff1a;标题、创建时间、开店方式、合作期限、面积要求 网页分析 …

大模型部署框架 FastLLM 实现细节解析

0x0. 前言 接着 大模型部署框架 FastLLM 简要解析 这篇文章首先梳理了一下FastLLM的调用链和关键的数据结构&#xff0c;然后解析了 FastLLM 的一些实现细节和CPU/GPU后端实现采用的优化技巧。 0x1. 调用链和数据结构解析 以chatglm-6b的支持为例&#xff0c;函数入口在 htt…

NLP实验案例100个(1-5)

实验一 array数组&#xff08;01&#xff09; 一、实验目的及要求 1.安装numpy环境&#xff0c;掌握基本的数组知识以及操作。 二、实验设备&#xff08;环境&#xff09;及要求 开发环境&#xff1a;jupyter notebook 开发语言以及相关的库&#xff1a;python开发语言、nu…

微信小程序开发,小程序类目符合,线上版本无权限申请wx.getLocation接口

我开发 的小程序类目符合wx.getLocation接口的申请标准 但是却还是显示无权限申请 后来研究好久才发现&#xff0c;小程序需要在发布线上版本时提交用户隐私保护指引 如未设置也可以在 设置-服务内容声明-用户隐私保护指引-声明处理用户信息项并补充填写后提交用户隐私协议审核…

使用docker-compose搭建lnmpr环境

源码gitee compose 使用的三个步骤&#xff1a; • 使用 Dockerfile 定义应用程序的环境。 • 使用 docker-compose.yml 定义构成应用程序的服务&#xff0c;这样它们可以在隔离环境中一起运行。 • 最后&#xff0c;执行 docker-compose up -d 命令来启动并运行整个应用程序…

D2L学习记录-10-词嵌入word2vec

NLP-1-词嵌入(word2vec) 参考: 《动手学深度学习 Pytorch 第1版》第10章 自然语言处理 第1、2、3 和 4节 (词嵌入) 词嵌入 (word2vec)&#xff1a; 词向量&#xff1a;自然语言中&#xff0c;词是表义的基本单元。词向量是用来表示词的向量。词嵌入 (word embedding)&#x…

常见的正则表达式

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 1、手机号或座机&#xff1a; 2、邮箱&#xff1a; 3、中文&#xff1a; 4、数字&#xff1a; 5、英文&#xff1a; 6、组合&#xff1a; 问题现象&#xff1a; 今天在项目中&…

数据库转换分析软件:EasyMorph 5.X Crack

EasyMorph 为您和您的团队提供数据超能力。无需编码技能。不要问 IT 人员。 自己做。 内置动作 即使您不是 IT 专家&#xff0c;也可以从任何地方检索数据并自动执行复杂的数据转换 无需 SQL 或编程知识 — 设计简单且 100% 可视化 减少对企业IT部门的依赖&#xff0c;减少繁琐…

Git的远程操作与多人协作

"爱在地图上剥落&#xff0c;我离孤单几公里~" 我们目前所说、所学的内容&#xff08;工作区、暂存区、版本库&#xff09;都只是存在于本地上&#xff0c;也就是说你的一台机器上只有这么一个你维护的版本库。可是Git是一个分布式版本控制系统&#xff0c;这又是什…

YOLO 划分数据集(训练集、验证集、测试集)

目录 前言训练集、验证集&#xff08;8:2&#xff09;训练集、验证集、测试集&#xff08;7:2:1&#xff09; 前言 本博客是在我的另一篇博客 VOC 格式与 YOLO 格式的相互转换 的基础上进行的&#xff0c;有需要可以参考 以下代码亲测可以直接复制运行&#xff08;以下所有的路…