Qt TCP相关的一些整理:服务端常见操作 socket 通信 network

目录

前言:

1、相关的库和类       

2、服务端常用API

核心代码呈上:


前言:

        在Qt的服务端上,不单单会用到服务端本身的API,对连接上来的客户端,也需要进行数据交互,也要用到一些收发包相关的API操作;

1、相关的库和类
       

        Qt下使用tcp协议,需要在工程的pro文件中添加:

         QT    += network

        需要添加network网络库之后,才可以使用对应的类

客户端的类头文件:

#include <QTcpSocket>

服务端的类头文件:

#include <QTcpServer>
 

2、服务端常用API

        qt的服务端套接字把常见的bind和listen合并成一个listen函数了:

bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);

监听完成之后,就得考虑接受客户端连接了

会有如下这几个API:

// 等待客户端连接
bool waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR); // 判断是否有客户端连接过来
virtual bool hasPendingConnections() const; // 用得最多还是这个nextPendingConnection函数,可以直接拿到客户端套接字
virtual QTcpSocket *nextPendingConnection(); 

当前,Qt是基于信号槽的,而且默认socket是异步的,所以也会有一个客户端连接触发的信号

void newConnection();  // 当有客户连接之后,会自动触发该信号

当有客户端连接过来之后,就会自动触发该信号,此时只需要写一个槽函数来和该信号关联即可

拿到新的客户端连接,拿到该连接套接字之后,就可以和客户端进行数据交互了

如以下代码:

// connectSlot 为自定义槽函数
connect(m_server,SIGNAL(newConnection()),this,SLOT(connectSlot()));

自定义槽函数:

void ServerMainWindow::connectSlot()
{    QTcpSocket *client = m_server->nextPendingConnection();qDebug()<<client;QByteArray buffer = "欢迎来到码蚁软件服务器。";qDebug()<<client->write(buffer);
}

当然,还可以专门写一个槽来和已连接的客户端进行交互

void ServerMainWindow::clientSlot()
{QTcpSocket * client = static_cast<QTcpSocket *>(sender());QByteArray buffer = client->readAll();qDebug()<<buffer.data();
}

当然,加了槽之后,前面的connectSlot代码可以稍微改动一下:

void ServerMainWindow::connectSlot()
{    QTcpSocket *client = m_server->nextPendingConnection();    qDebug()<<client;    if(!client->isValid()) return;    m_clients[client] = HEART_CHECK_TIMES; // 用于心跳检测的map    // 关联与客户端通信的自定义收包槽            connect(client,SIGNAL(readyRead()),this,SLOT(clientSlot()));    QByteArray buffer = "欢迎来到码蚁软件服务器。";    qDebug()<<client->write(buffer);
}

OK,这样写了之后,就可以和前面那一篇的客户端代码进行交互测试了,

找不到前一篇的话,可以点传送门过去看看哈:

 Qt TCP相关的一些整理:客户端常见操作 socket 通信 network-CSDN博客

 好了,下一篇将进行心跳检测的处理,敬请期待。【已更】

C++ Qt TCP的心跳检测机制,断线重连技术,应用层代码重新实现-CSDN博客

核心代码呈上:

完整代码下载地址:点我下载

头文件:

#ifndef SERVERMAINWINDOW_H
#define SERVERMAINWINDOW_H#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>namespace Ui {
class ServerMainWindow;
}class ServerMainWindow : public QMainWindow
{Q_OBJECTpublic:explicit ServerMainWindow(QWidget *parent = 0);~ServerMainWindow();
private slots:void connectSlot(); // 处理连接的槽void clientSlot(); // 与客户端交互的槽
private:Ui::ServerMainWindow *ui;QTcpServer *m_server;QMap<QTcpSocket*,int> m_clients;
};#endif // SERVERMAINWINDOW_H

源文件:

#include "servermainwindow.h"
#include "ui_servermainwindow.h"
#include <QDebug>#define HEART_CHECK_TIMES 6ServerMainWindow::ServerMainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::ServerMainWindow)
{ui->setupUi(this);m_server = new QTcpServer(this);if(m_server->listen(QHostAddress::Any,8898)){qDebug()<<"listen ok";connect(m_server,SIGNAL(newConnection()),this,SLOT(connectSlot()));}else{qDebug()<<"listen fail"<<m_server->errorString();}}ServerMainWindow::~ServerMainWindow()
{delete ui;
}void ServerMainWindow::connectSlot()
{QTcpSocket *client = m_server->nextPendingConnection();qDebug()<<client;if(!client->isValid()) return;m_clients[client] = HEART_CHECK_TIMES; // 用于心跳检测的map// 关联与客户端通信的自定义收包槽connect(client,SIGNAL(readyRead()),this,SLOT(clientSlot()));QByteArray buffer = "欢迎来到码蚁软件服务器。";qDebug()<<client->write(buffer);
}void ServerMainWindow::clientSlot()
{QTcpSocket * client = static_cast<QTcpSocket *>(sender());QByteArray buffer = client->readAll();qDebug()<<buffer.data();
}

最后,顺便把最终的效果呈现以下。

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

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

相关文章

代码随想录刷题】Day16 二叉树03

文章目录 1.【104】二叉树的最大深度&#xff08;优先掌握递归&#xff09;1.1 前言1.2 题目描述1.3 递归法java代码实现1.4 迭代法java代码实现1.5 相关练习题【559】N叉树的最大深度 2.【111】二叉树的最小深度&#xff08;优先掌握递归&#xff09;2.1 题目描述2.2 递归法ja…

力扣每日一题-美化数组的最少删除数-2023.11.21

力扣每日一题&#xff1a;美化数组的最少删除数 开篇 今天的力扣每日一题居然写出来了&#xff0c;好开心&#xff0c;迫不及待地把题目分享出来&#xff0c;希望你也能把它狠狠拿下。 题目链接: 2216.美化数组的最少删除数 题目描述 代码思路 创建一个list集合来保存数组&a…

c语言上机作业:给函数增加防御机制

1.题目 2.思路 1.首先&#xff0c;我们可以知道&#xff0c;我们必须先要把z求出来&#xff0c;但这里需要注意的是x&#xff0c;y并不包含了全部的定义域&#xff0c;所以我们必须先判断是否输入的数据满足条件。而这&#xff0c;就是我们所需要突破的函数的防御&#xff0c;…

.nvmrc 文件使用详解

文章目录 1. 前言2. .nvmrc 是什么3. 创建 .nvmrc 文件4. 使用 .nvmrc 文件5. 终端自动切换版本 1. 前言 当开发多个项目时&#xff0c;每个项目运行环境要求的 node 版本不一样&#xff0c;那么我们就需要给每个项目指定 node 版本&#xff0c;也就是通过终端执行 nvm install…

风丘电动汽车热管理方案 为您的汽车研发保驾护航

热管理技术作为汽车节能、提高经济性和保障安全性的重要措施&#xff0c;在汽车研发过程中具有重要作用。传统燃油汽车的热管理系统主要包括发动机、变速器散热系统和汽车空调&#xff0c;而电动汽车的热管理系统在燃油汽车热管理架构的基础之上&#xff0c;又增加了电机电控热…

Android HAL学习 及 与BSP的区别

Android HAL学习 及 与BSP的区别 参考链接&#xff1a; 1、https://www.cnblogs.com/looner/articles/11579335.html 2、https://blog.csdn.net/leesan0802/article/details/124087630 3、https://zhuanlan.zhihu.com/p/336531442 在HAL的学习之前&#xff0c;我们来先了解…

SPASS-指数平滑法

基本概念及统计原理 基本概念 指数平滑法的思想来源于对移动平均预测法的改进。指数平滑法的思想是以无穷大为宽度&#xff0c;各历史值的权重随时间的推移呈指数衰减&#xff0c;这样就解决了移动平均的两个难题。 统计原理 简单模型 Holt线性趋势模型 案例 为了研究上海市…

数据结构(c语言版) 树的遍历

作业要求 以如下图为例&#xff0c;完成树的遍历&#xff1a; 1、利用孩子兄弟表示法的存储结构 2、利用先根序列创建树 3、先根遍历树 4、后根遍历树 思考 预期的结果应该为&#xff1a; 1、先根创建树时需要输入的数据为&#xff1a; A B E 0 F 0 0 C 0 D G 0 0 0 0 2、…

七、HDFS文件系统的存储原理

1、总结 之所以把总结放在文件开头&#xff0c;是为了让读者对这篇文章有更好的理解&#xff0c;&#xff08;其实是因为我比较懒……&#xff09; 对于整个HDFS文件系统的存储原理&#xff0c;我们可以总结为一句话&#xff0c;那就是&#xff1a; 分块备份 2、存储结构和问题…

使用Navicat将SQL server数据库导入mysql数据库

使用Navicat将SQL server数据库导入mysql数据库 1、使用Navicat Premium打开MySql数据库&#xff0c;然后新建一个数据库名&#xff08;该数据库名称为需要从SqlServer数据库导过来的名称&#xff0c;mysql只有小写&#xff0c;不影响&#xff09; 比如需要将SqlServer数据库…

计数排序+桶排序 详讲(思路+图解+代码详解)

文章目录 计数排序和桶排序一、计数排序概念&#xff1a;写法一&#xff1a;写法二&#xff1a; 二、桶排序概念代码 计数排序和桶排序 一、计数排序 时间复杂度&#xff1a;空间复杂度&#xff1a;稳定性&#xff1a;稳定 概念&#xff1a; 非基于比较的排序 计数排序又称为…

PACS系统源码,WORKLIST数字化工作流程,影像数字化存储,电子报告书写、胶片打印

PACS系统源码 可与医院HIS、LIS无缝连接 PACS系统以实现医学影像数字化存储、诊断为核心任务&#xff0c;从医学影像设备&#xff08;如CT、CR、DR、MR、DSA、RF等&#xff09;获取影像&#xff0c;集中存储、综合管理医学影像及病人相关信息&#xff0c;建立数字化工作流程。 …

文章系列2:Unraveling the functional dark matter through global metagenomics

这篇文章发布于2023年10月nature。通讯作者是来自于 DOE Joint Genome Institute, Lawrence Berkeley National Laboratory, Berkeley, CA, USA. 背景介绍&目标 作者首先背景介绍了两种主流宏基因组分析方法&#xff0c;包括reads-based reference mapping&#xff08;eg…

chromium114添加新的语言国际化支持

一、需求说明 需要chromium114支持新语言体系,例如藏语,蒙古语,苗语等 二、操作步骤 1. build/config/locales.gni修改 在all_chrome_locales变量中添加新的语种标识,如下图。 2. 添加编译文件,告诉浏览器在编译时需要加载和输出那些文件 尝试编译出现错误一提示。需要…

读像火箭科学家一样思考笔记05_思想实验

1. 思想实验室 1.1. 思想实验至少可以追溯到古希腊时期 1.1.1. 从那时起&#xff0c;它们就跨越各个学科&#xff0c;在哲学、物理学、生物学、经济学等领域取得重大突破 1.1.2. 它们为火箭提供动力&#xff0c;推翻政府&#xff0c;发展进化生物学&#xff0c;解开宇宙的奥…

优秀智慧园区案例 - 三亚市崖州湾科技城智慧园区,先进智慧园区建设方案经验

一、项目背景 三亚崖州湾科技城作为海南自贸港建设的重点园区&#xff0c;是重点推进的海南自贸港先导项目之一。崖州湾科技城全力抢抓有利时机&#xff0c;进一步拓宽发展思路&#xff0c;持续深化体制机制创新&#xff0c;牢牢把握“打造产学研城深度融合的聚集地”这一核心…

问题:vue2+elementui,tabs切换显示表格并设置表格选中行高亮失败

错误示范&#xff1a; 1.直接setCurrentRow失败&#xff08;this.currentRow是之前保存的表格当前选中行的数据&#xff09; this.$refs.table.setCurrentRow(this.currentRow);2.以为是表格没生成就执行了setCurrentRow导致设置不成功&#xff0c;所以使用了this.$nextTick&…

同为科技(TOWE)桌面PDU插排:一款可以DIY定制的“超级插座”

当今社会&#xff0c;各种电子产品和家用电器已成为人们日常生活中不可或缺的一部分&#xff0c;在带给人们便利的同时&#xff0c;也使得电力使用变得更加频繁和重要。然而&#xff0c;当前市面上很多普通插座由于功能单一、材质粗劣、插口数量受限、充电速度过慢、插头间互相…

人机交互——机器人形态

1.聊天机器人 2.任务型机器人 3.面向FAQ的问答机器人 4.面向KB的问答机器人

seismicunix基础-声波波动方程推导

seismicunix基础-声波波动方程推导 接触波动方程的研究人员都绕不开这个公式&#xff0c;这是在一维状态下波动方程 但是对于这个方程是怎样来的很少有人能说清楚&#xff0c;其中涉及到牛顿第二运动定律&#xff0c;物体的加速度与受到的力有关。 假设一维弦是大量紧密连接的质…