QT聊天室基于Tcp

server.cpp
#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();//服务器设置监听// bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);// 参数1:监听的地址,指定的主机,或任意// 参数2:监听的端口号,可以是指定,也可是系统提供bool ret = server -> listen(QHostAddress::Any, port);if(ret == false){QMessageBox::information(this, "", "启动服务器失败");return;}ui -> startBtn -> setText("已启动");//此时若有客户端发来连接请求,那么服务器就会自动发射一个newConnect()信号//我们就可以将该信号连接到自定义的槽函数中,获取客户端的套接字connect(server, &QTcpServer::newConnection, this, &Widget::new_connection_slot);}//有新的客户端连接 connect 对应的槽函数
void Widget::new_connection_slot()
{//连接最先连接的客户端套接字// 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++){if(socketList.at(i) -> state() == 0){//移除无效客户端socketList.removeAt(i);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++) {//不发送信息到发送信息的客户端if(i == j){continue;}socketList.at(j) -> write(msg);}}}
}
sever.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket> //客户端的类
#include <QMessageBox>
#include <QList> // 链表容器QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void on_startBtn_clicked();void new_connection_slot();void readyRead_slot();private:Ui::Widget *ui;QTcpServer *server;//定义一个存放客户端的容器//template <typename T>//class QListQList<QTcpSocket *> socketList;
};
#endif // WIDGET_H
client.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this)) //给客户端实例空间 ,指定父对象this
{ui->setupUi(this);//初始化界面ui -> usrEdit -> setText("风呤");ui -> portEdit -> setText("8888");ui -> ipEdit -> setText("192.168.127.22");ui -> msgEdit -> setEnabled(false);ui -> sendbtn -> setEnabled(false);ui -> disLinkEdit -> setEnabled(false);
// ui -> listWidget -> setMaxLength();//设置文本自动换行ui -> listWidget -> setWordWrap(true);connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnect_slot);}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_linkBtn_clicked()
{//获取ui界面上的ip和端口号QString ip = ui -> ipEdit -> text();quint16 port = ui -> portEdit -> text().toUInt();//让客户端连接服务器//virtual void connectToHost(const QString &hostName, quint16 port,//OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);socket -> connectToHost(ip, port);//若成功连接服务器,那么客户端就会发送一个connected()信号//那么我们就可以将该信号连接到自定义的槽函数中处理逻辑代码,由于只需连接一次,故连接函数可写入构造函数中connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
}void Widget::connected_slot()
{//告诉服务器我来了usrname = ui -> usrEdit -> text();QString msg = usrname + ":已进入聊天室";//将信息发送到服务器socket -> write(msg.toLocal8Bit());//连接服务器成功QMessageBox::information(this, "", "已连接");//组件可用的相关设置ui -> msgEdit -> setEnabled(true);ui -> sendbtn -> setEnabled(true);ui -> disLinkEdit -> setEnabled(true);ui -> ipEdit -> setEnabled(false);ui -> linkBtn -> setEnabled(false);ui -> portEdit -> setEnabled(false);ui -> usrEdit -> setEnabled(false);//程序运行到此,说明客户端成功与服务器建立连接,若服务器发来数据,那么客户端就会自动发射一个readyRead信号//我们就可以将该信号连接到自定义的槽函数,读取数据,
}void Widget::disconnect_slot()
{ui -> msgEdit -> setEnabled(false);ui -> sendbtn -> setEnabled(false);ui -> disLinkEdit -> setEnabled(false);ui -> ipEdit -> setEnabled(true);ui -> linkBtn -> setEnabled(true);ui -> portEdit -> setEnabled(true);ui -> usrEdit -> setEnabled(true);
}void Widget::readyRead_slot(){//QByteArray msg = socket -> readAll();//ui -> listWidget -> addItem(QString::fromLocal8Bit(msg));}//发送按钮对应的槽函数
void Widget::on_sendbtn_clicked()
{//获取ui界面上的信息QString msg = ui -> msgEdit -> text();QString msg1 = msg + ":" + usrname;msg = usrname + ":" + msg;//发送给服务器socket -> write(msg.toLocal8Bit());//将发送的文本输出到listWidget中QListWidgetItem * item= new QListWidgetItem(msg1);ui-> listWidget -> addItem(item);item->setTextAlignment(Qt::AlignRight);//右对齐//清空行编辑器ui -> msgEdit -> clear();
}void Widget::on_disLinkEdit_clicked()
{//告诉服务器断开连接QString msg = usrname + ":已离开";socket -> write(msg.toLocal8Bit());socket -> disconnectFromHost();//若成功断开,那么客户端就会发送一个disconnected信号//我们就可以将该信号连接到自定义的槽函数}
client.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
#include <QLineEdit>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_linkBtn_clicked();void connected_slot();void disconnect_slot();void readyRead_slot();void on_sendbtn_clicked();void on_disLinkEdit_clicked();private:Ui::Widget *ui;QTcpSocket *socket;QString usrname;
};
#endif // WIDGET_H
相关文章:
QT聊天室基于Tcp
server.cpp #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; }…...
公开课观后感:密歇根大学python for everyone
从2024年1月17日到2024年8月20日,终于将密歇根大学的python for everyone的python公开课跟完。站在一月份规划的时刻来看,比我想象中花费的时间更多,我当时肯定没有想到要花上整整七个月的时间才能将这个公开课的内容看完,毕竟这个…...
goweb框架-gin
文章目录 Gin框架概览Gin框架的特点Gin框架的安装和基本使用安装基本使用 路由系统路由的基本概念Gin框架路由的特点 Radix Tree(基数树)基数树的定义和原理基数树在Gin框架中的应用节省空间的优化动态路由和通配符处理 路由树的构建注册路由的过程路由树…...
2024年接口测试高频面试题及答案
1. 什么是接口测试? •接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求 •测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系 2. 为什么要做接口…...
ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(8)
接前一篇文章:ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(7) 前边几回分析了笔者在MQTT测试时所遇到的问题: 最终定位到了是由于components\components\tcp_transport\transport_ssl.c的base_poll_write函数中调用的select函数超时返回…...
Linux: 忘记密码的解决方法,passwd
https://www.redhat.com/sysadmin/recover-root-passwd 这里的方法很简单,就是通过console进去,添加一个启动参数,加载sysroot,然后用passwd命令修改密码。这个是RHEL7适用。 https://access.redhat.com/solutions/1192 这个是提…...
36. 有效的数独【 力扣(LeetCode) 】
一、题目描述 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图…...
机器学习中的没有免费午餐定理
嘿,各位机器学习的爱好者们!今天,让我们一起深入探讨机器学习中那个神秘而又重要的概念——没有免费午餐定理。 一、定理引入:探索算法森林的钥匙 在广阔无垠的机器学习领域中,免费午餐定理就如同一把神奇的钥匙&…...
高级java每日一道面试题-2024年8月21日-框架篇[Spring篇]-使用IOC容器应该注意哪些?
如果有遗漏,评论区告诉我进行补充 面试官: 使用IOC容器应该注意哪些? 我回答: 1. 理解IOC的基本概念 控制反转:在传统的编程模式中,程序会主动控制依赖关系的创建和管理。而在IoC容器中,这种控制权被反转给了容器本身。程序员只需要声明…...
LLM训练推理相关概念
1. 有监督微调(Supervised Fine-Tuning)与指令微调(Instruction Fine-Tuning)对模型参数的影响 **有监督微调(Supervised Fine-Tuning, SFT)和指令微调(Instruction Fine-Tuning, Instruct-Tun…...
IP in IP 协议
IP in IP 是一种多重IP协议,即:客户机可以发送一个IP协议内部在嵌套一个IP协议到某个特定的主机上,在由具体的主机作为路由进行转发的协议。 例如: IP in IP帧协议结构为,第一层为发送到IP in IP 路由主机的报文&…...
DAY2: HTTP请求报文和响应报文是怎样的,有哪些常见的字段?| HTTP有哪些请求方式?| GET请求和POST请求的区别
目录 HTTP请求报文和响应报文是怎样的,有哪些常见的字段? 请求报文 响应报文 HTTP有哪些请求方式? GET请求和POST请求的区别 HTTP请求报文和响应报文是怎样的,有哪些常见的字段? HTTP报文分为请求报文和响应报文…...
线性代数:每日一题1/特征值与相似对角化
设A, B 为二阶矩阵,且 AB BA , 则“A有两个不相等的特征值”是“B可对角化"的() A. 充分必要条件 B. 充分不必要条件 C.必要不充分条件 D.既不充分也不必要条件 知识点: 特征向量与特征值的关系 相似矩阵的定义和性质 n阶…...
Android UI:PopupWindow:API
文章目录 类操作 对PopupWindow的操作 创建PopupWindow对象的操作添加并显示PopupWindow的操作移除PopupWindow的操作更新PopupWindow的操作显示内容的相关操作 布局的相关操作进入退出动画的相关操作 Transition设置进入动画的相关操作Transition设置退出动画的相关操作XML设置…...
什么是DevUI?
DevUI是面向企业中后台产品的开源前端解决方案,其设计价值观基于"高效、开放、可信、乐趣"四种自然与人文相结合的理念,旨在为设计师、前端开发者提供标准的设计体系,并满足各类落地场景,是一款企业级开箱即用的产品。 …...
DAY53
作业: 运行1个服务器和2个客户端 实现效果: 服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接,2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视服务器是否发来…...
python中len是什么
Python len() 方法返回字符串长度。 len()方法语法: len( str ) 返回值: 返回字符串长度。 以下实例展示了len()的使用方法: #!/usr/bin/python str "this is string example....wow!!!"; print "字符串长度: ", len…...
推荐一个开源的kafka可视化客户端GUI工具(Kafka King)
大佬的博客地址: https://blog.ysboke.cn/posts/tools/kafka-king Github地址: https://github.com/Bronya0/Kafka-King Kafka-King功能清单 查看集群节点列表(完成)支持PLAINTEXT、SASL PLAINTEXT用户名密码认证(完…...
day 10 贪心算法
455. 分发饼干 饼干从大的开始利用,优先满足胃口大的; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int res0;int indexs.size()-1;for…...
网络安全审计技术原理与应用
网络安全审计概述 概念 定义:对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作 作用:建立“事后”安全保障措施,保存网络安全事件及行为信息,为网络安全事件分析提供线索及证据,以便发现潜在网络安全威胁行为,开展网络安全风险分析及管理 常…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
