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

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.lryc.cn/news/106459.html

相关文章:

  • meanshift算法通俗讲解【meanshift实例展示】
  • 正交变换和仿射变换
  • Electron 多端通信桥 MessageChannelMain和 MessagePortMain 坑点汇集
  • Html5播放器按钮在移动端变小的问题解决方法
  • Rust 开发环境搭建【一】
  • C# Blazor 学习笔记(3):路由管理
  • int[]数组转Integer[]、List、Map「结合leetcode:第414题 第三大的数、第169题 多数元素 介绍」
  • vue子传父的一种新方法:this.$emit(‘input‘, value)可实现实时向父组件传值
  • 【Web】web
  • css中的bfc是什么?
  • 【前端知识】React 基础巩固(四十四)——其他Hooks(useContext、useReducer、useCallback)
  • 华为云hcip核心知识笔记(数据库服务规划)
  • 【有趣的】关于Map的一些小测试
  • 【MATLAB第63期】基于MATLAB的改进敏感性分析方法IPCC,拥挤距离与皮尔逊系数法结合实现回归与分类预测
  • AI 绘画Stable Diffusion 研究(二)sd模型ControlNet1.1 介绍与安装
  • 接口参数设计原则
  • 网络安全防护利器:SK5代理与IP代理的技术对比
  • IDEA删除本地git仓库、创建本地git仓库、关联其他仓库并上传
  • JavaEE简单示例——在使用Tomcat的时候可能出现的一些报错
  • webrtc的线程模型
  • 数据库备份还原-mysqldump、mydumper、xtrabackup、压缩
  • 【黑马程序员前端】JavaScript入门到精通--20230801
  • 100道Java多线程面试题(上)
  • web开发中的安全和防御入门——csp (content-security-policy内容安全策略)
  • 定了!全国2023下半年软考(高级、中级、初级)报名时间汇总
  • Linux下安装配置Redis
  • 深度学习(33)——CycleGAN(2)
  • WeakMap and WeakSet(弱映射和弱集合)
  • 【Vue3基础】组件保持存活、异步加载组件
  • 在 3ds Max 中使用相机映射将静止图像转换为实时素材