Qt TCP 网络通信01

2023-11-07

概念

windows 和 Linux 套接字相似

  • 局域网和广域网
    • 局域网:将一定区域内各种计算机,外部通信设备和数据库连接起来形成计算机通信的私有网络
    • 广域网:又称广域网、外网、公网。是连接不同地区局域网或城域网的远程公共网络

TCP/UDP区别

TCP UDP
建立连接 三次握手
断开连接 四次挥手
数据校验 数据丢失自动重传
传输协议 流式 报文
传输完成 断开连接 关闭套接字

流式传输协议:发送端接收端处理数据可以不均等。可以分次接收

报文传输:发送端发送数据与接收端接收数据相等。

TCP通信流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LmSGgBu8-1621870319644)(E:\Aha\学习\QT\qt并发网络通信\picture\tcp通信流程.png)]

UDP通信流程

在这里插入图片描述

ftp 与 http

套接字通信

在标准C++下没有提供专门用于套接字的通信,所以操作系统只能调用C的API函数。可以自己封装通信类。使用Qt提供的类进行基于TCP的套接字通信一共需要用到两个类:

  • QTcpServer:服务器类,用于监听客户端连接和客户端建立连接
  • QTcpSocket:通信的套接字类,客户端,服务器端都要使用

这两个通信模块network

QTcpServer

公共函数

liseten

bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
  • address:监听IP,默认 any,包含 ipv4 和 ipv6
  • port:监听端口

islisten

bool QTcpServer::isListening() const

Returns true if the server is currently listening for incoming connections; otherwise returns false.

serverAddress

QHostAddress QTcpServer::serverAddress() const

如果设置监听,则返回监听地址,如果没有则返回 nullpter

serverPort

quint16 QTcpServer::serverPort() const

如果设置监听,则返回监听端口,否则返回0

端口范围:0-65535Ditto

0-1024 固定 建议使用 5000+

nextPendingConnection

[virtual] QTcpSocket *QTcpServer::nextPendingConnection()

阻塞等待客户端发起的连接请求,不推荐在单线程中使用,建议使用非阻塞方式处理新连接,即使用信号newConnection

  • QTcpSoket是QTcpServer的一个子对象,结构上是父子关系,没有继承关系。

    使用完后可以 用 delete 也可以自动释放。

waitForNewConnection

bool QLocalServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR)

等待建立连接,没有连接回一直阻塞,不推荐使用

  • msec:等待最大时间
  • timeout:超时则为 true, 没有超时则为 false。

信号槽

acceptError

void QTcpServer::acceptError(QAbstractSocket::SocketError socketError)

当接收新连接失败时,发射此信号

newConnection

void QTcpServer::newConnection()

建立新连接时发出此信号

connectToHost

[virtual] void QAbstractSocket::connectToHost
    (const QString &hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)

连接服务器,需要指定服务器绑定的IP和端口

  • hostName:指定要连接的地址 IP地址
  • port:服务器端绑定的端口
  • openMode:read/write
  • protocol:使用默认

QTcpSocket

这是一个套接字通信类,不管是客户端还是服务端都要使用到。在Qt中发送和接收数据也属于IO操作。这是继承关系

在这里插入图片描述

QFile主要操作磁盘数据,QTcpSocket操作网络数据

公共函数

读取数据

qint64 QIODevice::read(char *data, qint64 maxSize);
QByteArray QIODevice::read(qint64 maxSize);
QByteArray QIODevice::readAll();
  1. c 语言风格读入,指定最大数据,读到指针data中
  2. Qt风格读入,设定可接收的最大数据,返回字符串
  3. 全部读入,返回读出的字符串

写入数据

qint64 QIODevice::write(const char *data, qint64 maxSize);
qint64 QIODevice::write(const char *data);
qint64 QIODevice::write(const QByteArray &byteArray);
  1. 发送指针,向 内存中写入 maxSize 个数据
  2. 发送 data 向指向的内存中写入数据, 以 \0结束
  3. 发送参数指定的字符串

信号

connected

[signal] void QAbstractSocket::connected()

connectToHost()建立连接成功发出此信号

disconnected

[signal] void QAbstractSocket::disconnected()

当断开连接时发送此信号

readyRead()

[signal] void QIODevice::readyRead()

数据到达发送此信号

Qt 的write() 与read() 都不是直接操作的网络数据,而是操作的Qt维护的在本地磁盘的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt TCP 网络通信01 的相关文章

随机推荐

  • 重写QTabWidget,在标签后面添加图标按钮

    原本的QTabWidget没有支持在标签后面添加自定义的按钮的方法 想在后面添加自定义的功能按钮需要重写QTabWidget类 自己实现按钮图标的重绘和鼠标点击判断等操作 1 使用到的主要事件函数 1 void paintEvent QPa
  • scrollview嵌套recyclerview滑动冲突

    给recyclerview设置下面这个属性就行了 recycler setNestedScrollingEnabled false
  • Guns入门

    一 下载源码包 下载地址 https gitee com stylefeng guns 先将项目的guns admin sql下的SQL文件导入到数据库中 主要数据表
  • Java中常见的运行时异常

    ArithmeticException 算数运算异常 由于除数为0引起的异常 ClassCast Exception 类型转换异常 当把一个对象归为某个类 但实际上此对象并不是由这个类创建的 也不是其子类创建的 则会引起异常 ArraySt
  • Ethernet_II帧和802.3_Ethernet帧格式比较

    一 Ethernet帧格式的发展 1980 DEC Intel Xerox制订了Ethernet I的标准 1982 DEC Intel Xerox又制订了Ehternet II的标准 1982 IEEE开始研究Ethernet的国际标准8
  • 【Linux】linux进程间通信netlink socket(用户与内核通信) 二

    目录 1 netlink socket介绍 2 netlink socket特点 3 为什么引入generic netlink 4 netlink通信架构 5 相关结构体 5 1 genl family 5 2 genl ops 5 3 n
  • 如何快速合并两个有序数组?

    前言 大家好 我是来自于 华为 的 程序员小熊 今天给大家带来一道与 数组 相关的题目 这道题同时也是字节 微软和亚马逊等互联网大厂的面试题 即力扣上的第 88 题 合并两个有序数组 本文主要介绍 逆向双指针 的策略来解答此题 供大家参考
  • Windows 纤程详解

    Windows 纤程详解 在Windows2000 XP中 纤程 fiber 相当于用户级别的线程或轻进程 纤程由Win32库函数支持 对核心是不可见的 纤程可以通过SwitchToFiber显示至另一合作纤程 以实现合作纤程之间的协同 纤
  • STM32程序下载的三种方式

    今天介绍下载STM32程序的三种方式 1 J Flash下载 需要用到J link J Flash 2 MDK配置下载 需要用到J link ST link keil 3 ISP下载 需要用到FlyMcu 串口线 上面提到的硬件和软件图片如
  • 20230802-下载并安装android-studio

    下载 android studio 安装包 https developer android google cn studio 安装android studio 双击安装包 D Android Studio
  • 6.统计累积访问次数

    文章目录 核心思路 核心思路 使用窗口函数sum xx over patition by yy order by zz 当sum窗口函数没有order by时 得到的是分组后的指定列值的总和 有order by时 则是指定列值的前缀累加和
  • c++析构函数后加上virtual的原因

    c 析构函数后加上virtual的原因 虚函数 指向基类的指针在操作它的多态类对象时 会根据不同的类对象 调用其相应的函数 实现动态绑定 C 析构函数加上virtual是为了防止内存泄漏 假设基类中采用的是非虚析构函数 当删除基类指针指向的
  • QT 在主机默认PDF查看应用中打开PDF文档(如通过菜单栏打开使用手册)

    QT 在主机默认PDF查看应用中打开PDF文档 如通过菜单栏打开使用手册 前言 在软件制作完成后 我们都需要告诉用户如何使用软件 使用手册 是一个非常必要的输出文件 能够让用户自行了解软件的使用方法 我观察到很多上位机会在菜单栏中加入打开使
  • numpy输出到屏幕时有逗号和没逗号的原因

    问题起源 输出一个数组 没有逗号 让我感到质疑是不是Numpy array格式 本质一个是print 一个没有用print
  • txt数据转换成json数据保存

    txt数据 小王 19 小李 20 小陈 21 js代码 初始化 const fs require fs const path require path 读取txt文档的数据 fs readFile path join dirname a
  • QDir::currentPath() 和 QApplication::applicationDirPath() 区别和用法

    1 QDir currentPath 的使用 我的理解 若在vs2010平台下 该函数返回的是 工作目录 属性 调试 工作目录 可自定义 Qt5 8 原文 Returns the absolute path of the applicati
  • 【数据结构】记录

    栈 堆 树 前序遍历 中序遍历 二叉树 搜索二叉树 二叉查找树 二叉查找树 BST Binary Search Tree 是一种特殊的二叉树 它改善了二叉树节点查找的效率 二叉查找树有以下性质 对于任意一个节点 n 其左子树 left su
  • Mac 配置selenium连接chrome

    输入chrome version 查看chrome版本 如图为87 0 4280 88 到网址http chromedriver storage googleapis com index html 上下载适合自己的版本 我需要下载的是87
  • Python Selenium库的使用

    一 Selenium基础 入门教程 Selenium官网教程 1 Selenium简介 Selenium是一个用于测试网站的自动化测试工具 支持各种浏览器包括Chrome Firefox Safari等主流界面浏览器 同时也支持phanto
  • Qt TCP 网络通信01

    概念 windows 和 Linux 套接字相似 局域网和广域网 局域网 将一定区域内各种计算机 外部通信设备和数据库连接起来形成计算机通信的私有网络 广域网 又称广域网 外网 公网 是连接不同地区局域网或城域网的远程公共网络 TCP UD