您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

一小例子,了解 TCP 通讯流程 | Qt 示例

时间:2022-07-25 11:36:51  来源:  作者:嵌入式开发小美老师

Hi,今天用一个小例子,陈述一下 Qt 里使用 TCP 通讯的流程。

代码链接:

https://doc.qt.io/qt-5/examples.NETwork.html

运行效果:

一小例子,了解 TCP 通讯流程 | Qt 示例

 

Server 端

运行效果:

一小例子,了解 TCP 通讯流程 | Qt 示例

 

显示 IP + 端口,然后静静地的等待客户端的连接。

源码文件:

msg_server/
├── msg_server.pro
├── mAIn.cpp
├── server.cpp
└── server.h

源码分析如下。

 

创建 TCP Server

在构造函数中进行初始化:

// server.cpp
Server::Server(QWidget *parent)
    : QDialog(parent)
    , statusLabel(new QLabel)
{
    // 建立 TCP Server,并监听
    tcpServer = new QTcpServer(this);
    tcpServer->listen()
    
    // 获取 Server 的 IP 地址,并用其初始化 UI
    [...]

    // 一旦有 TCP 连接,则调用 sendMsg() 发送数据给客户端
    connect(tcpServer, &QTcpServer::newConnection, this, &Server::sendMsg);
}

要点:

1、QTcpServer 是对 TCP-based server 的封装。

2、QTcpServer::listen() 用于监听是否有客户端发起连接。

3、一旦有客户端访问,QTcpServer 会发出 newConnection() 信号,我们通过绑定槽函数 sendMsg() 以实现发送消息的功能。

 

获取 Server IP

在界面上显示服务端的 IP 信息:

// server.cpp
Server::Server(QWidget *parent)
    : QDialog(parent)
    , statusLabel(new QLabel)
{
    // 创建 TCP Server
    [...]

    QString ipAddress;

    // 获得所有的 IP 地址
    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();

    // 解析出第一个可用的 IPv4 地址
    for (int i = 0; i < ipAddressesList.size(); ++i) {
        if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
            ipAddressesList.at(i).toIPv4Address()) {
            ipAddress = ipAddressesList.at(i).toString();
            break;
        }
    }

    // 初始化 UI
    [...]
}

要点:

1、QNetworkInterface 是对网络接口 (例如 lo、eth0...) 的封装。

2、QNetworkInterface::allAddresses() 会返回系统里所有的 IP 地址。

3、QHostAddress 是对 IP 地址(IPv4、IPv6) 的封装。

4、QHostAddress::toIPv4Address() 会将点分式的 IPv4 地址转换为数字式,例如 127.0.0.1 会被转换为 0x7F000001,失败则返回 0。

 

给客户端发送消息

当有客户端连接到来时,槽函数 sendMsg()会被调用 :

// server.cpp
void Server::sendMsg()
{
    // Prepare message
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out << message[QRandomGenerator::global()->bounded(message.size())];

    // Get pending connection
    QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
    connect(clientConnection, &QAbstractSocket::disconnected,
            clientConnection, &QObject::deleteLater);

    // Send message
    clientConnection->write(block);
    clientConnection->disconnectFromHost();
}

要点:

1、QTcpSocket 是对 TCP Socket 的封装。

2、为了与主机无关 (字节序等),这里选用 QByteArray 以二进制的格式来存储数据。使用 QDataStream 可以轻松地将 Message 写到 QByteArray 里。

3、QDataStream 从各种 IO 设备 (QIODeice 的子类),例如 QByteArray、文件 (QFile) 等读写二进制数据。

4、从 QTcpServer::nextPendingConnection() 获得客户端的 Socket。

5、用 QTcpSocket::write() 将 Message 通过网络发给客户端。

6、最后,通过 QTcpSocket::disconnectFromHost 断开连接,它会等待直到数据成功被写出去。

 

Client 端

运行效果:

一小例子,了解 TCP 通讯流程 | Qt 示例

 

每次点击 "Get Message" 按钮,客户端都会从服务端随机获取到一条问候信息。

源码文件:

msg_client/
├── msg_client.pro
├── client.cpp
├── client.h
└── main.cpp

创建 TCP Socket

// client.cpp
Client::Client(QWidget *parent)
    : QDialog(parent)
    , hostCombo(new QComboBox)
    , portLineEdit(new QLineEdit)
    , statusLabel(new QLabel(tr("This examples requires that you run then Message Server example as well.")))
    , getMsgButton(new QPushButton(tr("Get Message")))
    , tcpSocket(new QTcpSocket(this))
{
    // Init UI
    [...]

    // Setup QDataStream's source
    in.setDevice(tcpSocket);
    in.setVersion(QDataStream::Qt_5_10);

    // Setup signal & slot
    connect(getMsgButton, &QAbstractButton::clicked,
            this, &Client::requestNewMsg);
    connect(tcpSocket, &QIODevice::readyRead, this, &Client::readMsg);
}

要点:

1、用 QTcpSocket 创建 TCP Socket。

2、将 QDataStream 数据流的输入源设置为 Socket。

3、设置信号槽:当 Socket 有数据时,调用 readMsg() 将其读走。

 

从服务端读取消息

当用户点击 "Get Message" 按钮时,requestNewMsg() 会被调用

// client.cpp
void Client::requestNewMsg()
{
    getMsgButton->setEnabled(false);
    tcpSocket->abort();
    tcpSocket->connectToHost(hostCombo->currentText(),
                             portLineEdit->text().toInt());
}

要点:

1、QTcpSocket::connectToHost() 向服务端发起连接。

2、该函数没有返回值,是因为当有错误发生时,socket 会发出 error() 信号,我们可以通过绑定对应的槽函数进行错误处理。

3、成功连接后,服务端会随机发送一条信息过来,客户端接收到消息后,readMsg() 会被调用。

// client.cpp
void Client::readMsg()
{
    QString ;
    in >> nextFortune;
    statusLabel->setText(nextFortune);
    getMsgButton->setEnabled(true);
}

很简单的流操作,读到信息后,将其显示在界面上。

 

总结

用一张图总结一下 Qt TCP 通讯流程:

一小例子,了解 TCP 通讯流程 | Qt 示例

 

原文链接:
https://mp.weixin.qq.com/s/aCyV4HBwzTUZbCrdKsLtBw

文章转载自:老吴嵌入式

文章来源于:一小例子,了解 TCP 通讯流程 | Qt 示例

原文链接:一小例子,了解 TCP 通讯流程 | Qt 示例

版权声明:本文来源于网络,免费传达知识,版权归原作者所有,如涉及作品版权问题,请联系我进行删除



Tags:TCP   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01  Search: TCP  点击:(62)  评论:(0)  加入收藏
从零开始学习Python网络编程:探索TCP协议与实例演示!
Python 是一种高级的编程语言,拥有广泛的网络编程库。这些库允许 Python 开发者能够使用 TCP 和其他网络协议进行通信。在本文中,我们将探讨 TCP 协议,并通过一个简单的例子来...【详细内容】
2023-11-23  Search: TCP  点击:(220)  评论:(0)  加入收藏
TCP分段技术:克服IP和MAC层内存限制的关键
IP和MAC层在发送数据包时都面临内存受限的问题,这就导致它们对消息的长度有所限制。为了克服这个限制,TCP在将数据传递给IP层之前,需要将可变长度的字节打包成多个段,确保每个段...【详细内容】
2023-11-22  Search: TCP  点击:(245)  评论:(0)  加入收藏
TCP发送窗口、接收窗口以及其工作原理
可用窗口的计算是理解TCP滑动窗口的关键,要了解可用窗口的计算,我们需要理解三个指针&mdash;&mdash;SND.UNA、SND.NXT和RCV.NXT。上面的图表是从发送方的角度拍摄的快照。我们...【详细内容】
2023-11-13  Search: TCP  点击:(358)  评论:(0)  加入收藏
Wireshark抓包分析TCP协议:三次握手和四次挥手
前言 面试中我们经常会被问到TCP协议的三次握手和四次挥手的过程,为什么总喜欢问这个问题呢? 其实我们平时使用的很多协议都是应用层协议,比如HTTP协议,https协议,DNS协议,FTP协议...【详细内容】
2023-11-01  Search: TCP  点击:(244)  评论:(0)  加入收藏
一台服务器​最大并发 TCP 连接数多少
以一道运维面试题开局:你接触过的单机最大并发数是多少?操作系统最大文件打开数是65535,服务器又是怎么做到支持10w并发的?你认为当前正常配置的服务器物理机最大并发数可以到多...【详细内容】
2023-10-04  Search: TCP  点击:(71)  评论:(0)  加入收藏
C# 如何判断某个 TCP 端口是否被占用?
在C#中使用TcpClient或者其他通用的方式建立的Socket,该如何判断这个端口是否被占用?比如下面的代码:TcpClient tc = new TcpClient(ip,port);在C#中,可以使用 System.Net.Netwo...【详细内容】
2023-09-26  Search: TCP  点击:(62)  评论:(0)  加入收藏
网络层协议详解:理解TCP/IP、HTTP、FTP等协议的功能与工作原理
在计算机网络中,网络层是计算机通讯的重要组成部分,它负责处理数据包的传输和路由,是实现网络通信的必不可少的组件之一。网络层引入了三个协议:IP协议、ARP协议和路由协议。IP...【详细内容】
2023-09-06  Search: TCP  点击:(254)  评论:(0)  加入收藏
TCP与UDP协议:网络通信中的两大重要角色
引言在这个像点点滴滴组成的虚拟宇宙中,网络通信就像是我们的超级高速公路系统,让信息在世界间飞速穿梭。想象一下,如果网络是一条繁忙的交通道路,那么协议就是交通信号灯,确保数...【详细内容】
2023-09-01  Search: TCP  点击:(232)  评论:(0)  加入收藏
TCP、UDP是如何流量、拥塞控制的?今天一口气讲透!
一、TCP TCP首部 流量控制 拥塞控制 三次握手,四次挥手 tcp 怎样保证数据正确性?流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度1、TCP首部源端...【详细内容】
2023-07-18  Search: TCP  点击:(254)  评论:(0)  加入收藏
▌简易百科推荐
学生偷看“不良网站”,手机上3个痕迹无法清除,网友:咋不早说
众所周知,中国的常规教育中,总是“谈性色变”,但在这个信息爆炸的互联网时代,即便是一些年纪很小的孩子,也能轻易接触到一些所谓的不良网站,因此这一方面的教育缺失,其实是很可怕的...【详细内容】
2024-03-28    叶姐生活指南  Tags:不良网站   点击:(19)  评论:(0)  加入收藏
什么是网络中的路由器?核心功能解释
路由器是互联网连接的核心元素,是一种允许多个设备连接到互联网,并促进将数据包转发到各自的目标地址的设备。使用动态路由技术,路由器检查数据并在各种可用路径中选择最有效的...【详细内容】
2024-03-07    千家网  Tags:路由器   点击:(36)  评论:(0)  加入收藏
过年该不该升级Wi-Fi 7路由?看完就知道
打开电商网站不难发现,从2023年第三季度到现在,Wi-Fi 7路由器新品越来越多。而且价格不再是高高在上,已经基本和Wi-Fi 6路由价格差不多了。看到这些Wi-Fi 7新品路由,不少朋友就...【详细内容】
2024-02-27    中关村在线  Tags:Wi-Fi   点击:(45)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  云云众生s  微信公众号  Tags:Kubernetes   点击:(43)  评论:(0)  加入收藏
SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些...【详细内容】
2024-02-06  IDC点评网    Tags:SSL协议   点击:(74)  评论:(0)  加入收藏
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01    简易百科  Tags:TCP/IP   点击:(62)  评论:(0)  加入收藏
BGP路由属性:互联网路由的灵活控制器
在互联网的庞大网络中,边界网关协议(BGP)是确保不同自治系统(AS)间路由信息有效交换的关键协议。然而,BGP的功能远不止于此。其核心组成部分,即BGP路由属性,赋予了BGP强大的灵活性,使...【详细内容】
2024-01-26  诺诺爱生活    Tags:互联网路由   点击:(45)  评论:(0)  加入收藏
简易百科之什么是网络延迟?
简易百科之什么是网络延迟?随着互联网的普及和发展,网络已经成为我们生活中不可或缺的一部分。然而,我们在使用网络时可能会遇到一种情况,那就是网络延迟。那么,什么是网络延迟呢...【详细内容】
2024-01-24    简易百科  Tags:网络延迟   点击:(163)  评论:(0)  加入收藏
网络延迟与网络速度有什么区别?分享具体的答案
通常,许多人抱怨网速测试。速度还是不错的,但是他们玩游戏的时候怎么会卡住,还是断开连接等等问题,这一系列问题始终困扰着大家。那么,网络延迟与网络速度有什么区别呢?请不要担心...【详细内容】
2024-01-24  萌新小郭    Tags:网络延迟   点击:(54)  评论:(0)  加入收藏
揭秘IP地址的网络威胁与攻击类型
在当今数字化时代,网络攻击已经成为网络安全的一大挑战。IP地址,作为互联网通信的基础,也成为网络威胁和攻击的焦点之一。本文将深入探讨不同类型的网络威胁和攻击,以及如何防范...【详细内容】
2024-01-22  IP数据云    Tags:IP地址   点击:(88)  评论:(0)  加入收藏
站内最新
站内热门
站内头条