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

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日&#xff0c;终于将密歇根大学的python for everyone的python公开课跟完。站在一月份规划的时刻来看&#xff0c;比我想象中花费的时间更多&#xff0c;我当时肯定没有想到要花上整整七个月的时间才能将这个公开课的内容看完&#xff0c;毕竟这个…...

goweb框架-gin

文章目录 Gin框架概览Gin框架的特点Gin框架的安装和基本使用安装基本使用 路由系统路由的基本概念Gin框架路由的特点 Radix Tree&#xff08;基数树&#xff09;基数树的定义和原理基数树在Gin框架中的应用节省空间的优化动态路由和通配符处理 路由树的构建注册路由的过程路由树…...

2024年接口测试高频面试题及答案

1. 什么是接口测试&#xff1f; •接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求 •测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系 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 这里的方法很简单&#xff0c;就是通过console进去&#xff0c;添加一个启动参数&#xff0c;加载sysroot&#xff0c;然后用passwd命令修改密码。这个是RHEL7适用。 https://access.redhat.com/solutions/1192 这个是提…...

36. 有效的数独【 力扣(LeetCode) 】

一、题目描述 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图…...

机器学习中的没有免费午餐定理

嘿&#xff0c;各位机器学习的爱好者们&#xff01;今天&#xff0c;让我们一起深入探讨机器学习中那个神秘而又重要的概念——没有免费午餐定理。 一、定理引入&#xff1a;探索算法森林的钥匙 在广阔无垠的机器学习领域中&#xff0c;免费午餐定理就如同一把神奇的钥匙&…...

高级java每日一道面试题-2024年8月21日-框架篇[Spring篇]-使用IOC容器应该注意哪些?

如果有遗漏,评论区告诉我进行补充 面试官: 使用IOC容器应该注意哪些? 我回答: 1. 理解IOC的基本概念 控制反转&#xff1a;在传统的编程模式中&#xff0c;程序会主动控制依赖关系的创建和管理。而在IoC容器中&#xff0c;这种控制权被反转给了容器本身。程序员只需要声明…...

LLM训练推理相关概念

1. 有监督微调&#xff08;Supervised Fine-Tuning&#xff09;与指令微调&#xff08;Instruction Fine-Tuning&#xff09;对模型参数的影响 **有监督微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;和指令微调&#xff08;Instruction Fine-Tuning, Instruct-Tun…...

IP in IP 协议

IP in IP 是一种多重IP协议&#xff0c;即&#xff1a;客户机可以发送一个IP协议内部在嵌套一个IP协议到某个特定的主机上&#xff0c;在由具体的主机作为路由进行转发的协议。 例如&#xff1a; IP in IP帧协议结构为&#xff0c;第一层为发送到IP in IP 路由主机的报文&…...

DAY2: HTTP请求报文和响应报文是怎样的,有哪些常见的字段?| HTTP有哪些请求方式?| GET请求和POST请求的区别

目录 HTTP请求报文和响应报文是怎样的&#xff0c;有哪些常见的字段&#xff1f; 请求报文 响应报文 HTTP有哪些请求方式&#xff1f; GET请求和POST请求的区别 HTTP请求报文和响应报文是怎样的&#xff0c;有哪些常见的字段&#xff1f; HTTP报文分为请求报文和响应报文…...

线性代数:每日一题1/特征值与相似对角化

设A, B 为二阶矩阵&#xff0c;且 AB BA , 则“A有两个不相等的特征值”是“B可对角化"的&#xff08;&#xff09; A. 充分必要条件 B. 充分不必要条件 C.必要不充分条件 D.既不充分也不必要条件 知识点&#xff1a; 特征向量与特征值的关系 相似矩阵的定义和性质 n阶…...

Android UI:PopupWindow:API

文章目录 类操作 对PopupWindow的操作 创建PopupWindow对象的操作添加并显示PopupWindow的操作移除PopupWindow的操作更新PopupWindow的操作显示内容的相关操作 布局的相关操作进入退出动画的相关操作 Transition设置进入动画的相关操作Transition设置退出动画的相关操作XML设置…...

什么是DevUI?

DevUI是面向企业中后台产品的开源前端解决方案&#xff0c;其设计价值观基于"高效、开放、可信、乐趣"四种自然与人文相结合的理念&#xff0c;旨在为设计师、前端开发者提供标准的设计体系&#xff0c;并满足各类落地场景&#xff0c;是一款企业级开箱即用的产品。 …...

DAY53

作业&#xff1a; 运行1个服务器和2个客户端 实现效果&#xff1a; 服务器和2个客户端互相聊天&#xff0c;服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接&#xff0c;2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视服务器是否发来…...

python中len是什么

Python len() 方法返回字符串长度。 len()方法语法&#xff1a; len( str ) 返回值&#xff1a; 返回字符串长度。 以下实例展示了len()的使用方法&#xff1a; #!/usr/bin/python str "this is string example....wow!!!"; print "字符串长度: ", len…...

推荐一个开源的kafka可视化客户端GUI工具(Kafka King)

大佬的博客地址&#xff1a; https://blog.ysboke.cn/posts/tools/kafka-king Github地址&#xff1a; https://github.com/Bronya0/Kafka-King Kafka-King功能清单 查看集群节点列表&#xff08;完成&#xff09;支持PLAINTEXT、SASL PLAINTEXT用户名密码认证&#xff08;完…...

day 10 贪心算法

455. 分发饼干 饼干从大的开始利用&#xff0c;优先满足胃口大的&#xff1b; 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…...

网络安全审计技术原理与应用

网络安全审计概述 概念 定义:对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作 作用:建立“事后”安全保障措施,保存网络安全事件及行为信息,为网络安全事件分析提供线索及证据,以便发现潜在网络安全威胁行为,开展网络安全风险分析及管理 常…...

计算机网络之TCP序号,确认序号和报文传输时间

开篇提示 本篇适合于了解基础知识&#xff0c;进行扩展提高的使用&#xff0c;附带考研习题以及解析。 TCP序号和确认序号的区别 TCP首部中有序号和确认序号&#xff0c;他们都是4个字节&#xff08;4B&#xff09;&#xff0c;且在数据传输中有很重要的意义&#xff0c;那么两…...

HTML优化方法

HTML编码规范 代码格式化与缩进 1.缩进规则 ​ 推荐使用空格缩进而不是Tab&#xff0c;因为不同环境下空格的效果更加一致。常见缩进量为2个或4个空格 2.标签对齐 ​ 在嵌套的HTML结构中&#xff0c;子标签应当缩进&#xff0c;以清晰地展示层级关系。 3.属性的排列 ​ …...

Codeforces Round 961 D. Cases 【SOS DP、思维】

D. Cases 题意 有一个长度为 n n n 且仅由前 c c c 个大写字母组成的字符串&#xff0c;问最少选取多少种字母为每个单词的结尾&#xff0c;使得每个单词长度不超过 k k k 思路 首先注意到最后一个字母一定要选择&#xff0c;接下来我们给出一个断言&#xff1a;如果一个…...

VirtualBox上的Oracle Linux虚拟机安装Docker全流程

1.安装docker依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 2.安装docker仓库 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 生成docker的yum源配置到在 /etc/yum.repos.d/docker-ce.repo 3.安装D…...

LNMP安装部署

目录 一、Nginx安装部署 1.安装包下载 2.下载相关依赖工具 3. 创建运行用户 4.编译安装 5.优化路径 6.将nginx添加至系统服务 7.文件赋权 二、MySQL部署安装 1.解压 2.安装相关工具 3.创建运行用户 4.编译安装 5.修改配置文件 6.更改mysql安装目录和配置文件的属…...

django之自定义序列化器用法

在Django中&#xff0c;自定义序列化器方法通常用于处理复杂的数据转换逻辑&#xff0c;特别是在使用Django REST framework&#xff08;DRF&#xff09;时。自定义序列化器方法可以帮助你在序列化和反序列化过程中执行特定的逻辑&#xff0c;比如格式化日期、计算字段值、或者…...

20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并挂载1TB的exFAT格式的TF卡

fdisk -l df -h df -t df -T mount 20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并挂载1TB的exFAT格式的TF卡 2024/8/21 18:06 【切记&#xff0c;对于Rockchip原厂的Buildroot&#xff0c;如果你没有针对性的适配DTS&#xff1a;修改其中的GPIO口供电&#xff0c…...

多模态学习Multimodal Learning:人工智能中的多模态原理与技术介绍初步了解

多模态学习&#xff08;Multimodal Learning&#xff09;是机器学习中的一个前沿领域&#xff0c;旨在综合处理和理解来自不同模态的数据。模态可以包括文本、图像、音频、视频等。随着数据多样性和复杂性增加&#xff0c;多模态学习在自然语言处理、计算机视觉、语音识别等领域…...

外部环境连接kafka

修改配置文件外部环境连接kafka 1、kafka的docker官方镜像地址2、kafka官方介绍的三种连接方式3、方式一&#xff1a;Default configs默认配置4、方式二&#xff1a;File input&#xff08;文件输入&#xff1a;外部配置文件替换docker容器内的配置文件&#xff09;4.1、首先查…...

结合了MySQL数据库、Elasticsearch和Redis,构建一个产品搜索和推荐系统

1. 数据库设置&#xff08;MySQL&#xff09; 首先&#xff0c;我们需要创建两个表来存储产品信息和产品类别信息。 CREATE DATABASE product_system;USE product_system;CREATE TABLE categories (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,created_at…...

深圳 网站 设计/哈尔滨最新信息

题目描述 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]实现思路 这道题目运用到了普通的回溯剪枝以及深度优先遍历。 原本应该是这样的&#xff1a; 我们可以看到&am…...

网站建设亇金手指专业/新闻源软文发布平台

本文是《财务Python基础&#xff1a;字符串》视频的文字版笔记&#xff0c;供大家参考。Python中的字符串字符串是以单引号或双引号"括起来的任意文本。注意即使是数字&#xff0c;如果用引号引起来&#xff0c;那么也是字符串。字符串举例&#xff1a;1001&#xff0c;&q…...

中山网站建设价位/搜狗搜图

今天进行了我的微博研究&#xff1a;当其他人在发我时&#xff0c;将他的微博保存到“我”界面。单击我后显示所有我的微博。要在微博首页单击顶部菜单栏“信封图标”下“我的”&#xff0c;才能进入我界面。转载于:https://www.cnblogs.com/gaoemm/p/10242171.html...

如何做网络营销能成功呢/江西seo推广软件

最近带着几个在做一个项目&#xff0c;UI层面用的是WPF。之前很少深入的接触WPF&#xff0c;不过接触后&#xff0c;发现WPF的却是很强大。 至少在界面设计上的用户体验较WinForm有了大幅提升。 项目中需要通用化几个样式&#xff0c;并将样式赋值给相应的控件。控件是根据配置…...

海外营销推广 平台/seo还有用吗

groovy 2.5.4Apache Tomcat 7.0.8的错误和安全修复 已发布Apache Tomcat的新安全性和错误修复版本。 Apache Tomcat 7.0.8修复了使用基于APR的AJP连接器时可能发生的挂起的Servlet 3异步请求&#xff0c;并将无效URL参数的日志消息级别从“警告”更改为“信息”。 有关相关错误…...

青海公司网站建设/百度云资源搜索平台

一、前言 前后端分离开发是目前软件开发的主流&#xff0c;大大提高了开发效率 但也带来了很多不方便之处。 1、优点&#xff1a; ① 传统全栈开发的 MVC 模式将不适合&#xff0c;后台采取 MVP 面向接口编程&#xff0c;耦合度大大降低 2、缺点&#xff1a; ① 跨域问题…...