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

QT连接服务器通信,客户端以及服务器端

服务器端

.h文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer> //服务器头文件
#include <QTcpSocket> //客户端头文件
#include <QList>   //链表头文件,用来存放客户端容器
#include <QDebug>
#include <QMessageBox> //消息对话框类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void newConnection_slot();  //自定义处理newconnection信号槽函数void readyRead_slot(); //自定义处理readyRead信号槽函数private:Ui::Widget *ui;//定义服务器指针QTcpServer *server;//定义客户端指针链表容器QList<QTcpSocket *> clientList;
};
#endif // WIDGET_H

.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_pushButton_clicked()
{//获取ui界面上的端口号quint16 port = ui->lineEdit->text().toUInt();//将服务器设置成监听状态if(!server->listen(QHostAddress::Any,port)){QMessageBox::critical(this,"失败","服务器启动失败");return;}else{QMessageBox::information(this,"成功","服务器启动成功");}//此时表明服务器启动成功,并对客户端连接进行监听,如果有客户端向服务器发来连接请求//那么该服务器就会自动发射newconnection信号//我们可以将该信号连接到对应的槽函数中处理相关信息connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}
//处理newconnection信号的槽函数的实现
void Widget::newConnection_slot()
{qDebug()<<"有新的客户端发送连接请求";//获取最新连接的客户端套接字QTcpSocket *s = server->nextPendingConnection();//将获取的套接字存放到客户端容器中clientList.push_back(s);//此时,客户端就和服务器建立起来联系//如果该套接字有数据向服务器发送,那么该套接字就会自动发射一个readyRead信号//我们可以将该信号连接到自定义connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);}
//处理readyRead信号的槽函数
void Widget::readyRead_slot()
{//删除客户端链表中的无效客户端套接字//原型:SocketState state() const;//功能:返回客户端套接字的状态//参数:无//返回值:客户端的状态,如果结果为0,表示未连接for(int i=0; i<clientList.count(); i++){//判断套接字的状态if(clientList[i]->state() == 0){clientList.removeAt(i);  //将下标为i的客户端移出掉}}//遍历所有客户端,查看是哪个客户端发来数据for(int i=0; i<clientList.count(); i++){//函数原型: qint64 bytesAvailabe() const override;//功能:返回当前客户端套接字中的可读数据字节个数//参数:无//返回值:当前客户端待读的字节数,如果该数据为0,表示无待读数据if(clientList[i]->bytesAvailable() != 0){//读取当前客户端的相关数据//函数原型:QByteArray readAll();//功能:读取当前套接字中的所有数据,并返回一个字节数组QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面ui->msglist->addItem(QString::fromLocal8Bit(msg));//将接收到的该消息,发送给所有客户端for(int j=0; j<clientList.count(); j++){clientList[j]->write(msg);}}}
}

客户端

.h文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket> // 客户端头文件
#include <QMessageBox>
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 connected_slot();  //自定义处理信号的槽函数void readyRead_slot();  //自定义处理readyRead信号的槽函数void on_sendBtn_clicked();void on_disConnectBtn_clicked();void disconnected_slot(); //自定义处理disconnected信号函数private:Ui::Widget *ui;//定义一个客户端指针QTcpSocket *socket;QString userName;
};
#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给客户端指针实例化空间socket = new QTcpSocket(this);//如果连接服务器成功,该客户端就会发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次,所以,写在构造函数中即可connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//客户端与服务器连接成功后,如果服务器向客户端发送数据,那么该客户端就会自动发射一个readyRead信号//我们可以将connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//当客户端与服务器断开连接后,该客户端就会自动发射一个disconnectFromHost信号//我们可以将该信号与自定义的槽函数连接//由于只需要连接一次,所以将该函数写到构造函数中即可connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}
Widget::~Widget()
{delete ui;
}
//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{//获取ui界面的信息userName = ui->userNameEdit->text(); //获取用户名QString hostName = ui->ipEdit->text(); //获取主机地址quint16 port = ui->portEdit->text().toUInt(); //获取端口号//调用函数连接到主机socket->connectToHost(hostName,port); //向服务器发送连接请求}
//关于处理connected信号的槽函数的定义
void Widget::connected_slot()
{QMessageBox::information(this,"成功","连接服务器成功");//顺便向服务器发送一条消息,说:xxx:进入聊天室QString msg = userName + ":进入聊天室";socket->write(msg.toLocal8Bit());}
//关于readyRead信号对应槽函数的实现
void Widget::readyRead_slot()
{//读取该客户端中的数据QByteArray msg = socket->readAll();//将数据展示在ui界面ui->msgList->addItem(QString::fromLocal8Bit(msg));
}
void Widget::on_sendBtn_clicked()
{//获取ui界面中编辑的文本内容QString m = ui->msgEdit->text();//整合要发送的信息QString msg = userName + ": " + m;//将消息发送给服务器socket->write(msg.toLocal8Bit());//将消息编辑框中的内容清空ui->msgEdit->clear();
}
//断开服务器按钮对应的槽函数
void Widget::on_disConnectBtn_clicked()
{//准备要发送的信息QString msg = userName + ": 离开聊天室";socket->write(msg.toLocal8Bit());//调用成员函数disconnectFromHost//函数原型:virtual void disconnectFromHost()//功能:断开客户端与服务器的连接//参数:无//返回值:无socket->disconnectFromHost();}void Widget::disconnected_slot()
{QMessageBox::information(this,"退出","断开成功");
}

相关文章:

QT连接服务器通信,客户端以及服务器端

服务器端 .h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket> //客户端头文件 #include <QList> //链表头文件&#xff0c;用来存放客户端容器 #include <QDebug> #i…...

Vuex仓库的创建

vuex 的使用 - 创建仓库 文章目录 vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index.js4 在 main.js 中导入挂载到 Vue 实例上5.测试打印Vuex 1.安装 vuex 安装vuex与vue-router类似&#xff0c;vuex是一个独立存在的插件&#x…...

C++中的红黑树

红黑树 搜索二叉树搜索二叉树的模拟实现平衡搜索二叉树(AVL Tree)平衡搜索二叉树的模拟实现红黑树(Red Black Tree)红黑树的模拟实现 红黑树的应用(Map 和 Set)Map和Set的封装 搜索二叉树 搜索二叉树的概念&#xff1a;二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&…...

SQL语法知识回顾

一、SQL语言的分类 由于数据库管理系统&#xff08;数据库软件&#xff09;功能非常多&#xff0c;不仅仅是存储数据&#xff0c;还要包含&#xff1a;数据的管理、表的管理、库的管理、账户管理、权限管理等等。所以&#xff0c;操作数据库的SQL语言&#xff0c;也基于功能&am…...

Java基础二十七(泛型)

泛型 Java 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制&#xff0c;该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。 Java的泛型是伪…...

Python入门教程36:urllib网页请求模块的用法

urllib是Python中的一个模块&#xff0c;它提供了一些函数和类&#xff0c;用于发送HTTP请求、处理URL编码、解析URL等操作。无需安装即可使用&#xff0c;包含了4个模块&#xff1a; #我的Python教程 #官方微信公众号&#xff1a;wdPythonrequest&#xff1a;它是最基本的htt…...

LeetCode 每日一题 2023/9/4-2023/9/10

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/4 449. 序列化和反序列化二叉搜索树9/5 2605. 从两个数字数组里生成最小数字9/6 1123. 最深叶节点的最近公共祖先9/7 2594. 修车的最少时间9/8 2651. 计算列车到站时间9/…...

C# Onnx Yolov8 Seg 分割

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…...

Postman接口测试流程

一、工具安装 ● 安装Postman有中文版和英文版&#xff0c;可以选择自己喜欢的版本即可。安装时重新选择一下安装路径&#xff08;也可以默认路径&#xff09;&#xff0c;一直下一步安装完成即可。&#xff08;本文档采用英文版本&#xff09;安装文件网盘路径链接&#xff1…...

探索GreatADM:如何快速定义监控

引文 在数据库运维过程中&#xff0c;所使用的运维管理平台是否存在这样的问题&#xff1a; 1、默认监控粒度不够,业务需要更细颗粒度的监控数据。2、平台默认的监控命令不适合,需要调整阈值量身定制监控策略。3、不同类型的实例或组件需要有不同的监控重点,但管理平台监控固…...

C# 参数名加冒号,可以打乱参数顺序

今天看到Python有这种语法&#xff0c;参数名后面跟着等号写参数&#xff0c;联想到前几天用到的Serilog&#xff0c;好像有个参数名加冒号的写法&#xff0c;搜索了一下&#xff0c;果真有这种用法。 函数特别大的时候&#xff0c;用这种方法很直观&#xff0c;而且参数可以打…...

AVL树 模拟实现(插入)

目录 模拟插入节点 左单旋 右单旋 右左双旋 左右双旋 总结 实现 插入实现 左单旋实现 右单旋实现 右左双旋实现 左右双旋实现 AVL树 模拟实现&#xff08;插入&#xff09; AVL 树&#xff0c;是高度平衡二叉搜索树&#xff0c;其主要通过旋转来控制其左右子树的高…...

Java面试整理(三)《JavaSE》

反射机制(低) 在我刚开始学Java的时候,大家都很难理解反射这个概念,在实际开发中,虽然都有反射的踪影,但感觉自己又能理解是的。反射机制是指在程序运行时,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。 反射的步骤如下: 获取想要…...

LeetCode 1282. Group the People Given the Group Size They Belong To【哈希表】1267

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

Vue2项目练手——通用后台管理项目第八节

Vue2项目练手——通用后台管理项目 菜单权限功能tab.jsLogin.vueCommonAside.vuerouter/index.js 权限管理问题解决router/tab.jsCommonHeader.vuemain.js 菜单权限功能 不同的账号登录&#xff0c;会有不同的菜单权限通过url输入地址来显示页面对于菜单的数据在不同页面之间的…...

leetcode872. 叶子相似的树(java)

叶子相似的树 题目描述递归 题目描述 难度 - 简单 leetcode - 872. 叶子相似的树 请考虑一棵二叉树上所有的叶子&#xff0c;这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 举个例子&#xff0c;如上图所示&#xff0c;给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。 如果…...

【Linux从入门到精通】信号(初识信号 信号的产生)

本篇文章会对Linux下的信号进行详细解释。主要内容是什么是信号、信号的产生、核心转储等问题。希望本篇文章会对你有所帮助。 文章目录 引入 一、初识信号 1、1 生活中的信号 1、2 Linux 下的信号 1、3 信号进程所得的初识结论 二、信号的产生 2、1 用户通过终端输入产生信号 …...

Golang综合项目实战(一)

Golang综合项目实战&#xff08;一&#xff09; 01-项目简介02-项目架构、术语、运行结果03-创建并初始化项目04-创建用户模型和错误处理05-创建密码加密工具类06-保存密码之前的hooks07-创建用户名密码验证工具类08-用户数据库操作逻辑09-操作用户service10-创建商品分类模型…...

springmvc 获取项目中的所有请求路径

springboot/springmvc 获取项目中的所有请求路径 1. 编写业务代码 Autowiredprivate WebApplicationContext applicationContext;GetMapping("/getAllURL")public RestfulResult getAllURL() {// 获取springmvc处理器映射器组件对象 RequestMappingHandlerMapping无…...

【React学习】React高级特性

1. 函数式组件和类组件区别 函数式组件 函数式组件是一种简单的组件定义方式&#xff0c;它是一个以JavaScript函数为基础的组件。 可以把函数式组件理解为纯函数&#xff0c;它的输入为props&#xff0c;输出为JSX。函数式组件没有状态&#xff0c;也没有生命周期。 functio…...

如何在Windows系统搭建filebrowser私人网盘并实现在外网访问本地内网

Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问 文章目录 Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3…...

蓝桥杯官网练习题(算式900)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明的作业本上有道思考题&#xff1a; 看下面的算式&#xff1a; (□□□□-□□□□)*□□900其中的小方块代表 0 ~ 9 的数字&#xff0c;这 10 个方块刚好包含了…...

【C++从入门到精通】第1篇:C++基础知识(上)

文章目录 1.1 C语句和程序结构1.1.1 本篇介绍1.1.2 语句1.1.3 函数和主函数1.1.4 解析Hello world1.1.5 语法和语法错误1.1.6 练习时间 1.2 注释1.2.1 单行注释1.2.2 多行注释1.2.3 正确使用注释1.2.4 注释掉代码 1.3 对象和变量1.3.1 数据和值1.3.2 对象和变量1.3.3 变量实例化…...

liunx系统无sudo或管理员权限安装rar解压安装包

liunx无sudo权限安装rar解压安装包 &#xff08;1&#xff09;正常liunx安装rar&#xff08;2&#xff09;无sudo\root(管理员身份)时如何安装rar &#xff08;1&#xff09;正常liunx安装rar 1、下载安装包 WinRAR archiver, a powerful tool to process RAR and ZIP files (r…...

浅析目标检测入门算法:YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4

本文致力于让读者对以下这些模型的创新点和设计思想有一个大体的认识&#xff0c;从而知晓YOLOv1到YOLOv4的发展源流和历史演进&#xff0c;进而对目标检测技术有更为宏观和深入的认知。本文讲解的模型包括&#xff1a;YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4…...

C++:类和对象(三)

本文主要介绍初始化列表、static成员、友元、内部类、匿名对象、拷贝对象时编译器的优化。 目录 一、再谈构造函数 1.构造函数体赋值 2.初始化列表 3.explicit关键字 二、static成员 1.概念 2.特性 三、友元 1.友元函数 2.友元类 四、内部类 五、匿名对象 六、拷…...

分布式系统第三讲:全局唯一ID实现方案

分布式系统第三讲&#xff1a;全局唯一ID实现方案 本文主要介绍常见的分布式ID生成方式&#xff0c;大致分类的话可以分为两类&#xff1a;一种是类DB型的&#xff0c;根据设置不同起始值和步长来实现趋势递增&#xff0c;需要考虑服务的容错性和可用性; 另一种是类snowflake型…...

Ubuntu之apt-get系列--安装JDK8--方法/教程

原文网址&#xff1a;Ubuntu之apt-get系列--安装JDK8--方法/教程_IT利刃出鞘的博客 简介 本文介绍如何在Ubuntu下安装JDK8。 验证是否安装 可以通过如下命令判断系统是否有安装ssh服务&#xff1a; 命令 java -version 结果 如上所示&#xff0c;表示还没有安装。 查看…...

npm 实现原理

输入 npm install 命令并敲下回车后&#xff0c;会经历如下几个阶段&#xff08;以 npm 5.5.1 为例&#xff09;&#xff1a; 1.执行工程自身 preinstall 当前 npm 工程如果定义了 preinstall 钩子此时会被执行。 2.确定首层依赖模块 首先需要做的是确定工程中的首层依赖&a…...

国家开放大学 练习题

学前儿童社会教育活动指导 参考试题 一、单项选择题&#xff08;每小题3分&#xff0c;共30分&#xff09; 1.《规程》第三十二条规定&#xff1a;“幼儿园应当充分尊重幼儿的个体差异&#xff0c;根据幼儿不同的心理 发展水平&#xff0c;研究有效的活动形式和方法&am…...

网站建设注意事情/电商平台运营

1.团队课程设计博客链接 https://www.cnblogs.com/hq9-/p/10278470.html 2.个人任务 1&#xff09;权重功能实现 public static void accuAccordPercent(String tablename, String cname, Map<String, Double> per) {Connection conn null;PreparedStatement ps null;P…...

网站建设费属于文化事业建设费/百度热搜榜排名今日头条

转载&#xff1a;http://ling0322.info/2014/04/08/introduction-to-keyphrase-extraction.html 关键词提取就是从文本里面把跟这篇文章意义最相关的一些词抽取出来。这个可以追溯到文献检索初期&#xff0c;当时还不支持全文搜索的时候&#xff0c;关键词就可以作为搜索这篇论…...

家在深圳论坛业主论坛/廊坊seo网站管理

在做多语言版本的时候&#xff0c;日期时间的格式话是一个很头疼的事情&#xff0c;幸好Android提供了DateFormate&#xff0c;可以根据指定的语言区域的默认格式来格式化。直接贴代码&#xff1a; public static CharSequence formatTimeInListForOverSeaUser( final Context …...

湖南免费网站建设/中小企业管理培训课程

&#xff08;原标题&#xff1a;湖南省妇幼保健院自主开发国内首个妇幼移动就医平台&#xff09; 湖南省妇幼保健院自主开发国内首个妇幼移动就医平台—— 妇幼&#xff0c;就医方便在掌上 记者 段涵敏 通讯员 周文奕 “手机装了‘掌上妇幼’后&#xff0c;我再也不用到窗口…...

ps个人网站怎么做/外国网站的浏览器

linux可以与很多文件系统完美的结合&#xff0c;可以很容易地把Windows、其他Unix系统、甚至在市场上很小众的文件系统轻松地移植到linux中。 这对于linux今天的成功是功不可没的&#xff0c;那为什么这么厉害了&#xff0c;linux是怎么做到的呢&#xff1f;这里的功臣就是VFS&…...

为什么做网站还要续费/百度网址ip

为什么80%的码农都做不了架构师&#xff1f;>>> 序 本文主要研究下springboot2的ScheduledTasksEndpoint 实例 注解形式 Component public class ScheduleTask {Scheduled(cron "0 0 5 * * ?")public void cronJob(){}Scheduled(fixedDelay 2*60*1000…...