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

news2024/9/28 5:31:33

目录

前言:

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_OBJECT

public:
    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 6

ServerMainWindow::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.coloradmin.cn/o/1235914.html

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

相关文章

知识库文档处理

知识库文档处理 1 知识库设计2 文档加载2.1 PDF文档2.2 MD文档2.3 MP4视频 3 文档分割4 文档词向量化 本项目是一个个人知识库助手项目&#xff0c;旨在帮助用户根据个人知识库内容&#xff0c;回答用户问题。个人知识库应当能够支持各种类型的数据&#xff0c;支持用户便捷地导…

Go——二、变量和数据类型

Go 一、Go语言中的变量和常量1、Go语言中变量的声明2、如何定义变量方式1&#xff1a;方式2&#xff1a;带类型方式3&#xff1a;类型推导方式定义变量方式4&#xff1a;声明多个变量总结 3、如何定义常量4、Const常量结合iota的使用 二、Golang的数据类型1、概述2、整型2.1 类…

NGINX缓存详解之服务端缓存

服务端缓存 proxy cache属于服务端缓存,主要实现 nginx 服务器对客户端数据请求的快速响应。 nginx 服务器在接收到被代理服务器的响应数据之后,一方面将数据传递给客户端,另一方面根据proxy cache的配置将这些数据缓存到本地硬盘上。 当客户端再次访问相同的数据时,nginx…

数学几百年重大错误:将两异函数误为同一函数

黄小宁 因各实数都可是数轴上点的坐标所以数集A可形象化为数轴上的点集A&#xff0c;从而使x∈R变换为实数yxδ的几何意义可是&#xff1a;一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)运动到新的位置yxδ还在管道g内&#xff08;设各点只作位置改变而没别的改变即变位前…

flutter iOS 视频mov格式转MP4格式

flutter iOS 视频mov格式转MP4格式 前言一、使用video_compress压缩视频总结 前言 今天在写项目的时候&#xff0c;突然发现iOS 里面的有些视频格式是mov的格式&#xff0c;这就导致在视频播放组件无法播放的问题&#xff0c;期间试过替换视频格式&#xff0c;但是又不想存储文…

opencv-简单图像处理

图像像素存储形式  对于只有黑白颜色的灰度图&#xff0c;为单通道&#xff0c;一个像素块对应矩阵中一个数字&#xff0c;数值为0到255, 其中0表示最暗&#xff08;黑色&#xff09; &#xff0c;255表示最亮&#xff08;白色&#xff09; 对于采用RGB模式的彩色图片&#…

力扣1038. 从二叉搜索树到更大和树(java,树的中序遍历解法)

Problem: 1038. 从二叉搜索树到更大和树 文章目录 题目描述思路解题方法复杂度Code 题目描述 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c; 二叉搜索树 满足下列约束条件&#xff…

时序预测 | Pytorch实现TCN-Transformer的时间序列预测

时序预测 | Pytorch实现TCN-Transformer的时间序列预测 目录 时序预测 | Pytorch实现TCN-Transformer的时间序列预测效果一览基本介绍程序设计 效果一览 基本介绍 基于TCN-Transformer模型的时间序列预测&#xff0c;可以用于做光伏发电功率预测&#xff0c;风速预测&#xff0…

python趣味编程-5分钟实现一个石头剪刀布游戏(含源码、步骤讲解)

Python 中的石头剪刀布代码是 使用Tkinter和图形用户界面(GUI)设计的。 Python 石头剪刀布游戏是使用Python 编程语言开发的简单桌面应用程序。 项目系统文件包含资源文件和Python脚本。游戏画面流畅,用户控制起来很容易。

第4章 向量、SIMD和GPU体系结构中的数据级并行

4.1 引言 有多少应用程序拥有大量的数据级并行DLP&#xff1f;SIMD分类Flyn被提出后5年。答案不仅包括科学运算中的矩阵运算&#xff0c;还包括面向多媒体的图像和声音处理以及机器学习算法。 由于SIMD可以执行多个数据操作&#xff0c;能效比MIMD要高&#xff0c;使得SIMD对…

局域网无法上网主机通过TinyProxy代理主机访问公网Internet

1.代理主机搭建: 系统:ubuntu 网卡:2个 运行于 VMWare上 第一个网卡用于NAT 第二个网卡用于私有网络 两个IP如下: 192.168.31.243为NAT可访问Internet 192.168.144.141属于私有网络,用于访问局域网 安装tinyproxy sudo apt install tinyproxy 查看服务状态

你知道Linux操作系统的前世今生吗?Linux系统又该如何搭建呢?

文章目录 前言1. Linux 是什么1.1 Unix & Linux 发展历程图1.2 Linux 的发展1.3 Linux 的发行版 2. Linux 环境搭建2.1 环境搭建方式2.2 使用云服务器 3. 使用终端软件连接到 Linux3.1 什么是终端软件3.2 下载安装 XShell3.3 使用 XShell 登陆主机 总结 前言 可能很多人都…

2022最新版-李宏毅机器学习深度学习课程-P49 GPT的野望

GPT→类似于Transformer Encoder 训练任务&#xff1a;Predict Next Token 使用MASK-attention&#xff0c;不断预测“下一个token”。 可以用GPT生成文章。 How to use GPT? 给出描述和例子 给出前半段&#xff0c;补上后半段 In-context Learning(no GD) 结果 目前看起…

Jenkins 下载安装

下载 Jenkins 选择Download LTS是稳定版本,尽量选择稳定版本,然后选择你的开发系统. 安装 Jenkins需要JAVA环境&#xff0c;所以安装JAVA环境 Java Jenkins支持17、21等几个版本的Java&#xff0c;OpenJDK JDK 21.0.1 GA Release 安装不要安装到C盘,这个后面会占较大的…

力扣 622.设计循环队列

目录 1.解题思路2.代码实现 1.解题思路 首先&#xff0c;该题是设计循环队列&#xff0c;因此我们有两种实现方法&#xff0c;即数组和链表&#xff0c;但具体考虑后&#xff0c;发现数组实现要更容易一些&#xff0c;因此使用数组实现&#xff0c;因此我们要给出头和尾变量&a…

构建智能医患沟通:陪诊小程序开发实战

在医疗科技的浪潮中&#xff0c;陪诊小程序的开发成为改善医患沟通的创新途径之一。本文将介绍如何使用Node.js和Express框架构建一个简单而强大的陪诊小程序&#xff0c;实现患者导诊和医生咨询功能。 1. 安装Node.js和Express 首先确保已安装Node.js&#xff0c;然后使用以…

TS类型全解

使用TypeScript开发的程序更安全&#xff0c;常见的错误都能检查出来。TS能让程序员事半功倍。而原因在于TS的“类型安全”&#xff08;借助类型避免程序做无效的事情&#xff09;。 图 运行程序的过程 但是TS不会直接编译成字节码&#xff0c;而是编译成JavaScript代码。TS编…

MIT_线性代数笔记:列空间和零空间

目录 前言子空间综述列空间 Column space零空间&#xff08;或化零空间&#xff09;Nullspaceb 值的影响 Other values of b 前言 本节继续研究子空间&#xff0c;特别是矩阵的列空间&#xff08;column space&#xff09;和零空间&#xff08;nullspace&#xff09;。 子空间…

如何将Docker的构建时间减少40%

与许多公司类似&#xff0c;我们为产品中使用的所有组件构建docker映像。随着时间的推移&#xff0c;其中一些映像变得越来越大&#xff0c;我们的CI构建花费的时间也越来越长。我的目标是CI构建不超过5分钟——差不多是喝杯咖啡休息的理想时间。如果构建花费的时间超过这个时间…

6.Gin 路由详解 - GET POST 请求以及参数获取示例

6.Gin 路由详解 - GET POST 请求以及参数获取示例 GET POST 请求以及参数获取示例 Get 请求&#xff1a;获取 Quary 参数 // 获取query参数示例&#xff1a;GET /user?uid20&namejack&page1 r.GET("/user", func(c *gin.Context) {// 获取参数// Query获取参…