4/11 QT_day5

服务器端

头文件

#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 *ser;QList<QTcpSocket*> socketlist;
};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), ser(new QTcpServer(this))
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_startBtn_clicked()
{//获取ui界面上的端口号quint16 port = ui->portEdit->text().toUInt();//将字符串转换成整形(仅限纯数字字符串)//让服务器设置监听if(ser->listen(QHostAddress::Any,port) == true){//监听成功,跳出对话框QMessageBox::information(this,"","启动服务器成功");//服务器如果发来连接请求,那么服务器就会自动发射一个连接请求//那么就可以将该信号连接到自定义的槽函数中,处理逻辑代码}else{//监听失败QMessageBox::critical(this,"","启动服务器失败");return;}connect(ser,&QTcpServer::newConnection,this,&Widget::newConnection_slot);}
//newConnection信号对应的槽函数
void Widget::newConnection_slot()
{//获取最新连接的客户端的套接字QTcpSocket *s = ser->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++){//功能:判断客户端与服务器的连接状态//如果未连接,未连接的枚举对应的值为0if(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界面上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_disconnectBtn_clicked();void on_SendBtn_clicked();public slots:void connected_slot();void readRead_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)
{ui->setupUi(this);//设置不可用ui->msgEdit->setEnabled(false);ui->SendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);//如果连接成功到服务器,客户端会发送一个connect()函数connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
}Widget::~Widget()
{delete ui;
}void Widget::on_connectBtn_clicked()
{QString ip = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt();//客户端连接服务器socket->connectToHost(ip,port);}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->connectBtn->setEnabled(false);//如果服务端向客户端发来数据,那么客户端会自动发射一个readyRead()信号connect(socket,&QTcpSocket::readyRead,this,&Widget::readRead_slot);
}void Widget::readRead_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->msgEdit->setEnabled(false);ui->SendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->connectBtn->setEnabled(true);
}//按下断开连接按钮的槽函数
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/809450.shtml

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

相关文章

MSTP/RSTP与STP的兼容性

原理概述 MSTP(Multiple STP)协议和RSTP(Rapid STP)协议都可以向下兼容STP&#xff08;Spanning Tree Protocol &#xff09;协议。运行MSTP/RSTP协议的交换机会根据收到的BPDU版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU&#xff0c;MSTP/RSTP交换机…

Oracle 21c 数据库迁移到DM8(达梦)数据库

一、环境准备 1、创建脚本 执行dmCreateUser.sql脚本创建GLJ用户&#xff08;注意&#xff1a;需要与需要迁移的oracle用户名一样&#xff09;&#xff0c;如&#xff0c;脚本内容如下&#xff1a; -- 开始将输出重定向到指定的日志文件 spool start /home/dmdba/dmdbms/sql/…

蓝桥杯算法题:蓝桥骑士

题目描述 小明是蓝桥王国的骑士&#xff0c;他喜欢不断突破自我。 这天蓝桥国王给他安排了 N 个对手&#xff0c;他们的战力值分别为 a_1,a_2,…,a_n&#xff0c;且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战&#xff0c;也可以选择避战。 身为高傲的骑士&#xff…

基于物联网的智能家居远程视频监控系统设计与实现

基于物联网的智能家居远程视频监控系统设计与实现 摘要&#xff1a;随着物联网技术的快速发展&#xff0c;智能家居系统已成为提升家居安全性和便利性的重要手段。本文设计并实现了一套基于物联网的智能家居远程视频监控系统&#xff0c;该系统结合了嵌入式技术、网络通信技术…

节流和防抖

节流和防抖 定义和区别: 节流和防抖的概念。 节流是一种减少函数执行频率的技术&#xff0c;它通过设定一个等待时间(delay)&#xff0c;确保函数在这段时间内只执行一次。如果在等待时间内再次触发事件&#xff0c;则不会执行函数&#xff0c;直到等待时间结束。 防抖是一种控…

【Go语言】go语言简单的变量声明和结构体使用

目录 数字类型 布尔类型 字符串类型 Rune 类型 Byte 类型 类型转换 结构体 结构体定义 结构体作为函数参数 结构体方法 1. 接收者类型 2. 方法定义 3. 值接收者 vs 指针接收者 4. 调用方式的灵活性 5. 方法集 6. 方法与继承 7. 方法声明的位置 在Go语言中&…

【Linux】sudo分权管理实战

一般sudo命令是默认安装的&#xff0c;如果你的机器里没有&#xff0c;可以使用命令 yum install sudo 来安装 [rootgaosh-64 ~]# yum install sudo 我们来看一下配置文件&#xff1a; 在上图root下面添加一行 &#xff0c;给gaosh用户加权限 [rootgaosh-64 ~]# vim /etc/su…

中移物联网 OneOS 操作系统环境搭建和工程创建

一、官网 OneOS Lite是中国移动针对物联网领域推出的轻量级操作系统&#xff0c;具有可裁剪、跨平台、低功耗、高安全等特点&#xff0c;支持ARM Cortex-A和 Cortex-M、MIPS、RISC-V等主流芯片架构&#xff0c;兼容POSIX、CMSIS等标准接口&#xff0c;支持Javascript、MicroPyt…

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受&#xff0c;然后点击next 5.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 6.node.js安装路径&#…

哨兵-1A与DInSAR技术监测尼泊尔地震前后地表形变

2015年4月25号&#xff0c;尼泊尔发生里氏7.8级地震&#xff0c;超过5000人伤亡和几百万人受到影响。大量的卫星影像支持地震救援。地理学家利用卫星影像量测地震对陆地的影响。 Sentinel-1A是欧洲委员会发起的哥白尼环境监测计划中的第一颗卫星。可获取全天候的数据&#xff0…

实验6 单臂路由方式实现VLAN间路由

实验6 单臂路由方式实现VLAN间路由 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤1.配置IP地址2.交换机配置3.路由器配置 一、 原理描述 VLAN将一个物理的LAN在逻辑上划分为多个广播域。VLAN内的主机间可以互相通信&#xff0c;但是VLAN之间却不能互通。…

JAVAEE——网络初始

文章目录 网络发展史独立模式网络模式局域网LAN路由器的诞生 网络通信的基础IP地址端口号 认识协议OSI七层模型TCP/IP五层模型 网络发展史 独立模式 在原始的年代中电脑间想要通信需要两台电脑连接一根网线&#xff0c;但是一台电脑基本上只有一个接口。因此想要链接更多的电…

ChatGPT 写作秘籍:指导您如何利用ChatGPT撰写学术论文

ChatGPT无限次数:点击直达 ChatGPT 写作秘籍&#xff1a;指导您如何利用ChatGPT撰写学术论文 作为CSDN网站的作者&#xff0c;您可能经常面临不同类型的写作任务&#xff0c;包括学术论文的撰写。在这篇文章中&#xff0c;我们将探讨如何利用ChatGPT这一强大的文本生成工具来辅…

计算机基础知识-第9章-存储的本质(2)——硬盘和文件系统基础知识

一、机械硬盘的原理 概括来说&#xff0c;硬盘的工作原理是利用特定的磁粒子的极性来记录数据。磁头在读取数据时&#xff0c;将磁力子的不同极性转换成不同的电脉冲信号&#xff0c;再利用数据转换器将这些原始信号变成电脑可以使用的数据&#xff0c;写的操作正好与此相反。…

ubuntu或类Debian获取某些包的离线版本-包括依赖(还有一些意想不到的用途,哈哈)

前言 偶尔能碰到很特殊的情况。网址白名单&#xff0c;纯内网&#xff0c;超多依赖及一些很难描述的场景。 比如一些少见的发行版缺少某些包。这时候可以找一台类似的系统环境来下载离线包及 其依赖包&#xff0c;然后转移到内网进行安装。如果是网址白名单&#xff0c;或者纯内…

【讲解下常见的分类算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

牛客NC413 两个升序数组的中位数【hard 数组,模拟 Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/b3b59248e61f499482eaba636305474b 思路 直接模拟2个数组有顺序放到一个数组中help中如果help长度为奇数&#xff0c;返回中间的数如果help长度为偶数&#xff0c;返回中间2个数的和除以2参考答案java import j…

【AI 测试】八:数学基础在算法测试工程师工作中的具体应用

算法测试工程师在测试和优化算法时&#xff0c;确实需要具备扎实的数学基础。这是因为算法往往涉及到复杂的计算、逻辑推理和数据分析&#xff0c;而这些都需要依靠数学工具和方法来进行有效的处理。以下是数学基础在算法测试工程师工作中的具体应用&#xff1a; 线性代数&…

会话跟踪技术基础:Cookie和Session

久违了&#xff0c;之前忙碌了一周赶毕设&#xff0c;今天抽空更新~ 一.理论知识 1.会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应~ 2.会话跟…

【远程桌面】Microsoft Remote Desktop 4 mac

看起来 mac的apple store 不给下载mac apple store 微软官方可以直接下载 app center 最新版本。 官方文档 这里有更新的介绍和下载地址