QT实现tcp服务器客户端

服务器.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);// 此时,服务器已经成功进入监听状态,如果有客户端向服务器发来连接请求//那么该服务器,就会自动发射一个newConnection的信号,我们可以将该信号连接到对应槽函数中执行相关逻辑//由于只需要连接一次即可,所以可以将该连接放在构造函数中完成connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);}Widget::~Widget()
{delete ui;
}//启动服务器按钮对应的槽函数
void Widget::on_startBtn_clicked()
{quint16 port = ui->portEdit->text().toUInt();//监听客户端的连接请求//函数原型: bool listen(const QHostAddress &address = QHostAddress::Any,quint16 port = 0);//参数1:要监听的主机地址,如果是any表示监听任意一个主机地址,也可以是特定的主机地址//参数2:该服务器提供的端口号如果是0,表示有服务器指定,一般由程序员指定//返回值:成功进入坚挺状态,返回true,其他情况返回falseif(!server->listen(QHostAddress::Any, port)){QMessageBox::information(this, "失败", "监听失败");}else{QMessageBox::information(this, "成功", "监听成功");}
}//自定义处理newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{qDebug()<<"您有新的客户端发来连接请求";//获取最新链接的客户端套接字//函数原型:virtual QTcpsocket *nextPendingconnection() ;//参数:无//返回值:最新连接过来的客户端套接字的地址QTcpSocket *s = server->nextPendingConnection();//将该套接字放入客户端链表中clientList.push_back(s);//至此,多个客户端已经跟付曲奇建立连接,并放入客户端容器中//此时。如果有客户端向服务器发来数据,那么对应的客户端套接字就会自动发射一个readyRead信号//我们可以将该信号连接到自定义的槽函数中,处理相关逻辑connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);}
//readyRead对应槽函数的实现
void Widget::readyRead_slot()
{qDebug()<<"有新消息来咯";//遍历客户端链表,将无效的客户端移除for(int i=0;i<clientList.size();i++){//判断当前套接字是否是有效连接//函数原型:Socketstate state() const;//参数:无//返回值:套接字的状态,如果是0,表示该套接字无效if(clientList[i]->state() == 0){//将该套接字移除客户端容器clientList.removeAt(i);}}//遍历客户端链表,判断是哪个客户端发来数据for (int i=0;i<clientList.size();i++){//函数原型 :qint64 bytesAvailable() const override;//求当前哭护短套接字中歹毒数据的字节数//参数:无//返回值:待读数据的字节数,如果是0,表示无数据待读if(clientList[i]->bytesAvailable() != 0){//将改套接字的数据读出来QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面ui->msgwidget->addItem(QString::fromLocal8Bit(msg));//将接收到的数据转发给所有客户端for (int j=0;j<clientList.size();j++){clientList[j]->write(msg);}}}}

 客户端.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->sendBtn->setEnabled(false);//给客户端指针实例化对象socket = new QTcpSocket(this);//此时,已经向服务器发送连接请求了,如果成功连接服务器,那么该客户端就会自动发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理逻辑//由于只需要连接一次,所以将连接写在构造函数中connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);//如果服务器向客户端发来消息,那么该客户端就会自动发射一个readyRead信号//我们可以将该进行连接到自定义的槽函数中处理相关逻辑connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);//当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次即可,所以放在构造函数中进行connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{//获取ui界面上的相关信息userName = ui->userNameEdit->text();         //获取用户名QString ip = ui->ipEdit->text();            //主机地址quint16 port = ui->portEdit->text().toUInt();        //端口号//函数原型:virtual void connectToHost(const QHostAddress &address, quint16 port);//功能:将客户端连接到给定的服务器//参数1:服务器的主机地址//参数2:端口号//返回值:无socket->connectToHost(ip, port);//此时,已经向服务器发送连接请求了,如果成功连接服务器,那么该客户端就会自动发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理逻辑//由于只需要连接一次,所以将连接写在构造函数中ui->msgEdit->setEnabled(true);//设置消息编辑器为可用状态ui->ipEdit->setEnabled(false);//设置ip编辑器为不可以状态ui->portEdit->setEnabled(false);ui->userNameEdit->setEnabled(false);ui->sendBtn->setEnabled(true);//设置发送按钮为可用状态ui->disconnectBtn->setEnabled(true);}//处理connected信号的槽函数的定义
void Widget::connected_slot()
{QMessageBox::information(this, "成功", "您已经成功进入聊天室");//向服务器发送一条数据:***:进入聊天室QString msg = userName +": 进入聊天室";socket->write(msg.toLocal8Bit());          //将数据写给服务器
}//处理readyRead信号的槽函数的定义
void Widget::readyRead_slot()
{//读取套接字中的信息QByteArray msg = socket->readAll();//将数据展示到ui界面ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{//获取ui界面输入的内容QString msg =userName+ ": " + ui->msgEdit->text();//发送给服务器socket->write(msg.toLocal8Bit());//清空编辑框内容ui->msgEdit->clear();
}//断开服务器按钮对应的槽函数
void Widget::on_disconnectBtn_clicked()
{//告诉大家我走了QString msg = userName +": 离开聊天室";socket->write(msg.toLocal8Bit());//断开连接//函数原型: virtual void disconnectFromHost();socket->disconnectFromHost();//当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次即可,所以放在构造函数中进行ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);ui->userNameEdit->setEnabled(true);ui->disconnectBtn->setEnabled(false);ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);
}//disconnected信号对应槽函数的定义
void Widget::disconnected_slot()
{QMessageBox::information(this, "提示", "退出成功");
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LVGL_基础控件滑动条slider

LVGL_基础控件滑动条slider 1、创建滑动条控件 // 创建一个 slider 组件(对象)&#xff0c;他的父对象是活动屏幕对象 lv_obj_t *slider lv_slider_create(lv_scr_act()); LV_LOG_USER("lv_slider_get_value(slider) %d", lv_slider_get_value(slider));/* 设置位…

全屋灯具选购指南,如何选择合适的灯具。福州中宅装饰,福州装修

灯具装修指南 灯具就像我们家里的星星&#xff0c;在黑暗中带给我们明亮&#xff0c;可是灯具如果选择的不好&#xff0c;这个效果不仅体现不出来&#xff0c;还会让人觉得烦躁。 灯具到底该怎么选呢&#xff1f;装修灯具有哪些注意事项呢&#xff1f;给大家做了一个总结&#…

基于springboot的论坛网站

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 普通管理员管理 交流论坛 交流论坛评论 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了…

C语言qsort函数

排序qsort int int cmp(const void *a, const void *b) {return *(int *)a - *(int *)b;//先强转成int型&#xff0c;后解引用取值比较大小 }字符串数组 char a[] “hello world” //字符串数组&#xff0c;存放的是字符 int cmp(const void *a, const void *b) {return *(…

罗彻斯特大学探讨ChatGPT等人工智能将如何影响高等教育

人工智能聊天机器人ChatGPT持续引起互联网用户的热议&#xff0c;它能够回答关于各个领域的问题&#xff0c;创作歌曲、食谱&#xff0c;起草电子邮件等等。罗切斯特的教职员工和管理人员就他们如何处理 ChatGPT 以及它如何影响未来的教学和学习提出了他们的想法。 “让这项技…

快排(三种单趟排序法,递归非递归算法)

快排发明者:霍尔 (Sir Charles Antony Richard Hoare) 是一位英国计算机科学家。 计算机领域的爵士——托尼霍尔(Tony Hoare)(1934年1月11日出生),英文全称Sir Charles Antony Richard Hoare,常被称为Tony Hoare或者C. A. R. Hoare,1959年博士毕业于

idea清空缓存类

解决办法 网上有很多是让你去清空什么maven依赖&#xff0c;但假如这个项目是你不可以大刀阔斧的话 可以清空idea缓存 选择 Invalidate 开头的 然后全选 运行重启idea OK

FISCO BCOS(三十七)———FISCOBCOS应用开发,交易hash、区块高度的获取

这个需求怎么做? 交易hash的获取方式有很多,这里先介绍一种方式。 根据块高查询区块信息 https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Front/interface.html那我们如何知道现在的区块高度是多少? https://webasedoc.readthedocs.io/zh_CN/latest/docs/W…

VSCode Intellij IDEA CE 数据库连接

VSCode & Intellij IDEA CE 数据库连接 大概记一下现在正在用的几个工具/插件 VSCode VSCode 里面的工具我下载了很多&#xff0c;如果只是链接 MySQL 的话&#xff0c;可能用 Jun Han 这位大佬的 MySQL 就好了&#xff1a; 使用这个插件直接打开 .sql 文件单击运行就能…

nodejs+vue临沂特色产品销售平台elementui

从实际工作出发&#xff0c;对过去的临沂特色产品销售平台存在的问题进行分析&#xff0c;完善用户的使用体会。采用计算机系统来管理信息 提高了工作的效率。 随着信息化社会的形成和微电子技术日新月异的发展&#xff0c;临沂特色产品销售平台是针对目前临沂特色产品销售…

win10、win11彻底永久关闭自动更新的方法

win10、win11彻底永久关闭自动更新的方法 前言彻底关闭自动更新方法步骤一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务四、在注册表中关闭Win10自动更新 完结 前言 win系统的自动更新可谓是非常顽固&#xff0c;很多用户在网上试了各种关闭win系统自动更…

Ubuntu 20.04源码安装sysbench 1.0.20,源码安装sysstat v12.7.2

源码安装sysbench 1.0.20 参考的博客&#xff1a;《压测数据库1&#xff1a; Ubuntu 20 安装sysbench1.0.20》 sudo apt install -y automake libtool pkg-config下载依赖包&#xff0c;需要注意的是我这台计算机已经安装过mysql&#xff0c;所以我没有安装libmysqlclient-de…

【重拾C语言】六、批量数据组织(二)线性表——分类与检索(主元排序、冒泡排序、插入排序、顺序检索、对半检索)

目录 前言 六、批量数据组织——数组 6.1~3 数组基础知识 6.4 线性表——分类与检索 6.4.1 主元排序 6.4.2 冒泡排序 6.4.3 插入排序 6.4.4 顺序检索&#xff08;线性搜索&#xff09; 6.4.5 对半检索&#xff08;二分查找&#xff09; 算法比较 前言 线性表是一种常…

NPM 常用命令(九)

目录 1、npm link 1.1 使用语法 1.2 描述 2、npm login 2.1 描述 3、npm logout 3.1 描述 4、npm ls 4.1 使用语法 4.2 描述 5、npm org 5.1 使用语法 5.2 示例&#xff1a; 6、npm outdated 6.1 使用语法 6.2 描述 6.3 示例 7、npm owner 7.1 使用语法 7.2…

windows 任务计划自动提交 笔记到github 、gitee

一、必须有个git仓库托管到git上。 这个就不用说了&#xff0c;自己在github或者码云上新建一个仓库就行了。 二、创建自动提交脚本 这个bat脚本是在windows环境下使用的。 注意&#xff1a;windows定时任务下 调用自动提交git前&#xff0c;必须先进入该git仓库目录&#x…

机器学习---RBM、KL散度、DBN

1. RBM 1.1 BM BM是由Hinton和Sejnowski提出的一种随机递归神经网络&#xff0c;可以看做是一种随机生成的 Hopfield网络&#xff0c;是能够通过学习数据的固有内在表示解决困难学习问题的最早的人工神经网络之 一&#xff0c;因样本分布遵循玻尔兹曼分布而命名为BM。BM由二…

力扣 -- 1745. 分割回文串 IV

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:bool checkPartitioning(string s) {int ns.size();vector<vector<bool>> dp(n,vector<bool>(n));for(int in-1;i>0;i--){for(int ji;j<n;j){if(s[i]s[j]){dp[i][j]i1<j?dp[i…

C++设计模式-外观(Facade)

目录 C设计模式-外观&#xff08;Facade&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-外观&#xff08;Facade&#xff09; 一、意图 为子系统中的一组接口提供一个一致的界面&#xff0c;Facade模式定义了一个高层接口&#xff0c;这个接…

解决dockerfile创建镜像时pip install报错的bug

项目场景&#xff1a; 使用docker-compose创建django容器 问题描述 > [5/5] RUN /bin/bash -c source ~/.bashrc && python3 -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple: 0.954 Looking in indexes: https://…

深入了解 PostgreSQL:功能、特性和部署

PostgreSQL&#xff0c;通常简称为Postgres&#xff0c;是一款强大且开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它在数据存储和处理方面提供了广泛的功能和灵活性。本文将详细介绍 PostgreSQL 的功能、特性以及如何部署和使用它。 什么是 PostgreSQ…