4.11作业

服务器端

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTcpServer> //服务器端类
#include<QMessageBox> //消息对话框
#include<QTcpSocket> //客户端类
#include<QList> //链表容器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();public slots:void newConnection_slot();void readyRead_slot();private:Ui::Widget *ui;//实例化一个服务器指针QTcpServer *server;//定义一个存放客户端的容器QList<QTcpSocket *> socketList;};
#endif // WIDGET_H

#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_startBtn_clicked()
{//获取ui界面端口号quint16 port = ui->portEdit->text().toUInt(); //将字符串转换成整型//让服务器设置监听if(server->listen(QHostAddress::Any,port)){//监听成功QMessageBox::information(this,"","启动服务器成功!");}else{//监听失败QMessageBox::information(this,"","启动服务器!");return;}//程序运行到这,说明服务器监听成功,有客户端发来连接请求,//那么服务器端就会自动发射一个newconnection()信号//那么就可以将该信号连接到自定义的槽函数中,处理逻辑代码connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);}//newConnection信号对应的槽函数
void Widget::newConnection_slot()
{//获取最新连接客户端的套接字QTcpSocket *s = server->nextPendingConnection();//将套接字 放入链表容器中socketList.push_back(s);//此时,说明服务器与客户端成功建立连接,如果connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}//readyRead()信号对应槽函数
void Widget::readyRead_slot()
{//移除无效客户端for(int i=0;i<socketList.count();i++){//判断客户端与服务器连接的状态if(socketList.at(i)->state() == 0){//删除socketList.removeAt(i);}}//遍历容器,哪个有客户端有数据待读for(int i=0;i<socketList.count();i++){//返回数据的大小:bytesAvailable()if(socketList.at(i)->bytesAvailable()>0){//读取数据QByteArray msg = socketList.at(i)->readAll();//ui->listWidget->addItem(QString::fromLocal8Bit(msg));//将数据广播给所有客户端for(int j=0;j<socketList.count();j++){socketList.at(j)->write(msg);}}}
}

客户端

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTcpSocket>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 on_sendBtn_clicked();void on_disconnectBtn_clicked();public slots:void connected_slot();void readyRead_slot();void disconnected_slot();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), socket(new QTcpSocket(this)){ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);}Widget::~Widget()
{delete ui;
}//连接按钮对应的槽函数处理
void Widget::on_connectBtn_clicked()
{//获取到ui界面上的ip和端口号QString ip = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt();//客户端连接服务器socket->connectToHost(ip,port);}
//connected对应槽函数
void Widget::connected_slot()
{//告诉服务器我来了//组织语言username = ui->usernameEdit->text();QString msg = username+":进入聊天室";//将数据发送给服务器socket->write(msg.toLocal8Bit());//程序运行到这意味着服务器与客户端成功建立连接ui->msgEdit->setEnabled(true);ui->sendBtn->setEnabled(true);ui->disconnectBtn->setEnabled(true);ui->usernameEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->connectBtn->setEnabled(false);connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);}
void Widget::readyRead_slot(){//读取数据QByteArray msg = socket->readAll();//将读取到的数据放到ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));}//发送按钮对应的槽函数处理
void Widget::on_sendBtn_clicked()
{//获取Ui界面上的内容QString msg = ui->msgEdit->text();//组织语言msg = username + ":" + msg;socket->write(msg.toLocal8Bit());//清空内容ui->msgEdit->clear();}//断开与服务器连接的槽函数
void Widget::disconnected_slot()
{ui->msgEdit->clear();ui->sendBtn->setEnabled(false);ui->msgEdit->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->connectBtn->setEnabled(false);
}
//按下断开连接按钮的槽函数void Widget::on_disconnectBtn_clicked()
{QString msg = username + "已退出聊天室";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}

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

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

相关文章

Pycharm远程连接服务器配置详解

背景&#xff1a; 相信很多人都遇到了这种情况&#xff0c;日常的开发和程序的验证都需要在linux环境下验证&#xff0c;而我们都是使用本地windows来进行开发或者脚本的编写&#xff0c;然后再push到远程仓库&#xff0c;再到linux环境下pull下来代码验证&#xff0c;这样每次…

CorelDRAW21.2.4中文最新官方和谐版下载

CorelDRAW是一款由加拿大Corel公司出品的平面设计软件&#xff0c;也被称为CDR。它是一款功能强大的矢量图形制作和排版软件&#xff0c;主要面向绘图设计师和印刷输出人员。该软件提供了矢量插图、页面布局、图片编辑和设计工具&#xff0c;广泛应用于排版印刷、矢量图形编辑及…

HWOD:密码强度等级

一、知识点 回车键的ASCII码是10 如果使用EOF&#xff0c;有些用例不通过 二、题目 1、描述 密码按如下规则进行计分&#xff0c;并根据不同的得分为密码进行安全等级划分。 一、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二、字母: 0…

Day:006(3 ) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

selenium调用js方法 有时候我们需要控制页面滚动条上的滚动条&#xff0c;但滚动条并非页面上的元素&#xff0c;这个时候就需要借助js是来进行操作。 一般用到操作滚动条的会两个场景&#xff1a; 要操作的页面元素不在当前页面范围&#xff0c;无法进行操作&#xff0c;需要…

NotePad++ 快速生成SQL IN (‘’,‘’)

sql In(‘’&#xff0c;‘’)这种形式 第一步&#xff1a;AltC 鼠标放在第一行最左边 第二步 CtrlH $代表行末 第三步 去掉每行换行符 换行可能是"\n" 或者"\r"或者"\r\n" 结果&#xff1a;

容错组合导航

在初始值正确的情况下&#xff0c;惯性导航短期精度较高&#xff0c;但是其误差随着时间是累计的。如果要提高惯性导航的长期精度&#xff0c;就必须提高惯性器件的精度和初始读准精度&#xff0c;这必将大大提高成本。 如果将惯性导航与其他导航系统适当地组合起来&#xff0c…

熟练使用SpringBoot、SpringCloud、SpringCloud Alibaba 等微服务框架

一&#xff1a; Spring Boot 1. 什么是Spring Boot&#xff1f;它解决了什么问题&#xff1f; 答&#xff1a;Spring Boot是一个用于创建独立、生产级基于Spring的应用程序的框架。它简化了Spring应用程序的初始搭建以及开发过程&#xff0c;通过约定优于配置的方式&#xf…

Java泛型中 T 和 ? 傻傻分不清楚

1.定义&#xff1a; JDK5.0后&#xff0c;Java提供了泛型。 泛型是一种在编译时提供类型安全的方式&#xff0c;允许程序员在定义类、接口和方法时使用类型参数。这样&#xff0c;可以在不损失类型安全的情况下&#xff0c;创建可重用的代码。 泛型有两种主要的使用形式&#x…

linux学习:栈

目录 顺序栈 结构 初始化一个空顺序栈 压栈 出栈 例子 十进制转八进制 链式栈 管理结构体的定义 初始化 压栈 出栈 顺序栈 顺序栈的实现&#xff0c;主要就是定义一块连续的内存来存放这些栈元素&#xff0c;同时为了方便管理&#xff0c; 再定义一个整数变量来代表…

2024中国(宁波)国际宠物用品博览会

2024中国(宁波)国际宠物用品博览会 People&Pet Fair 2024 专注2B交易&#xff0c;关注人宠发展&#xff0c;它经济&#xff0c;势不可挡! 时间&#xff1a;2024年11月14-16日 地点&#xff1a;宁波国际会展中心 详询主办方陆先生 I38&#xff08;前三位&#xff09; …

水离子雾化壁炉与酒店大厅的氛围搭配

将水离子雾化壁炉与酒店大厅的氛围搭配是一个很好的主意&#xff0c;可以为大厅增添舒适、温馨的氛围&#xff0c;以下是一些建议&#xff1a; 迎宾区域&#xff1a;在酒店大厅的迎宾区域设置水离子雾化壁炉&#xff0c;作为客人抵达时的第一印象。壁炉的温馨效果可以让客人感到…

Java+BS +saas云HIS系统源码SpringBoot+itext + POI + ureport2数字化医院系统源码

JavaBS saas云HIS系统源码SpringBootitext POI ureport2数字化医院系统源码 医院云HIS系统是一种运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它按照现代医疗卫生管理要求&#xff0c;在特定区域内以数字化形式收集、存储、传递和处理医疗卫生行业的数据。通…

【应用】SpringBoot-自动配置原理

前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为&#xff1a;3.1.2。 前置知识 在看原理介绍之前&#xff0c;需要知道Import注解的作用&#xff1a; 可以导入Configuration注解的配置类、声明Bean注解的bean方法&#xff1b;可以导入ImportSele…

前置递增和后置递增

前置递增 先让变量1&#xff0c;然后进行表达式运算 int a2 10;int b2 a2 *10;cout<<"a2"<<a2<<endl;cout<<"b2"<<b2<<endl;运行结果&#xff1a;a211 b2110 后置递增 后置递增&#xff0c;先进行表达式运算&…

Python pathlib中Path用法

Python pathlib中Path用法 文章目录 Python pathlib中Path用法 Path类是Python中 pathlib模块的主要组成部分之一&#xff0c;它提供了一种面向对象的方式来处理文件系统路径。 Path对象可以表示文件路径或目录路径&#xff0c;并且可以执行各种与路径相关的操作&#xff0c;…

异构超图嵌入的图分类 笔记

1 Title Heterogeneous Hypergraph Embedding for Graph Classification&#xff08;Xiangguo Sun , PictureHongzhi Yin , PictureBo Liu , PictureHongxu Chen , PictureJiuxin Cao , PictureYingxia Shao , PictureNguyen Quoc Viet Hung&#xff09;【WSDM 2021】 2 Co…

模拟移动端美团案例(react版)

文章目录 目录 概述 项目搭建 1.启动项目&#xff08;mock服务前端服务&#xff09; 2.使用Redux ToolTik(RTK)编写store(异步action) 3.组件触发action并渲染数据 一、渲染列表 ​编辑 二、tab切换类交互 三、添加购物车 四、统计区域功能实现 五、购物车列表功能实现 六、控制…

Leetcode算法训练日记 | day23

一、修剪二叉搜索树 1.题目 Leetcode&#xff1a;第 669 题 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff…

netty实现mqtt(IOT)

springbootnettymqtt服务端实现 springbootnettymqtt客户端实现 MQTT协议基本讲解(结合netty) 李兴华netty视频教程中mqtt讲解 EMQX官网、mqttx客户端 IOT云平台 simple&#xff08;6&#xff09;springboot netty实现IOT云平台基本的架构&#xff08;mqtt、Rabbitmq&…

2024/4/2—力扣—最小高度树

代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ struct TreeNode* buildTree(int *nums, int l, int r) {if (l > r) {return NULL; // 递归出口}struct…