该示例演示了在本地主机上的TCP客户端和服务器是如何通讯的。

客户端

绑定信号槽。

connect(&tcpClient, &QAbstractSocket::connected, this, &Dialog::startTransfer); /* 连接到服务器时回送消息给服务器 */
connect(&tcpClient, &QIODevice::bytesWritten,this, &Dialog::updateClientProgress); /* 绑定写数据到服务器的信号槽 */

连接到服务器。

tcpClient.connectToHost(QHostAddress::LocalHost, tcpServer.serverPort());

这里比较有意思的是,客户端连接到服务器->客户端(tcpClient)触发startTransfer槽函数->调用tcpClient.write->触发QIODevice::bytesWritten信号->触发updateClientProgress槽函数调用->就一直tcpClient.write,直到if条件不成立后后停止发送。

void Dialog::startTransfer()
{// called when the TCP client connected to the loopback serverbytesToWrite = TotalBytes - int(tcpClient.write(QByteArray(PayloadSize, '@')));clientStatusLabel->setText(tr("Connected"));
}
void Dialog::updateClientProgress(qint64 numBytes)
{// called when the TCP client has written some bytesbytesWritten += int(numBytes);// only write more if not finished and when the Qt write buffer is below a certain size.if (bytesToWrite > 0 && tcpClient.bytesToWrite() <= 4 * PayloadSize) /* 直到if条件不成立后后停止发送 */bytesToWrite -= tcpClient.write(QByteArray(qMin(bytesToWrite, PayloadSize), '@'));clientProgressBar->setMaximum(TotalBytes);clientProgressBar->setValue(bytesWritten);clientStatusLabel->setText(tr("Sent %1MB").arg(bytesWritten / (1024 * 1024)));
}

服务端

绑定信号槽用于新连接:

connect(&tcpServer, &QTcpServer::newConnection,this, &Dialog::acceptConnection);

监听客户端连接。

!tcpServer.isListening() && !tcpServer.listen()

服务端新连接到来:

void Dialog::acceptConnection()
{tcpServerConnection = tcpServer.nextPendingConnection();if (!tcpServerConnection) {serverStatusLabel->setText(tr("Error: got invalid pending connection!"));return;}connect(tcpServerConnection, &QIODevice::readyRead,this, &Dialog::updateServerProgress); /* 接受客户端数据的槽函数 */connect(tcpServerConnection,QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),this, &Dialog::displayError); /* 错误反馈 */connect(tcpServerConnection, &QTcpSocket::disconnected,tcpServerConnection, &QTcpSocket::deleteLater); /* 断开反馈 */serverStatusLabel->setText(tr("Accepted connection"));tcpServer.close();
}

接收来自客户端的数据:

void Dialog::updateServerProgress()
{bytesReceived += int(tcpServerConnection->bytesAvailable());tcpServerConnection->readAll(); /* 读数据 */serverProgressBar->setMaximum(TotalBytes);serverProgressBar->setValue(bytesReceived); /* 设置进度条 */serverStatusLabel->setText(tr("Received %1MB") /* 显示在界面上 */.arg(bytesReceived / (1024 * 1024)));if (bytesReceived == TotalBytes) {tcpServerConnection->close();startButton->setEnabled(true);
#ifndef QT_NO_CURSORQApplication::restoreOverrideCursor();
#endif}
}

关于更多

  • QtCreator软件可以找到:
  • 或在以下Qt安装目录找到:
C:Qt{你的Qt版本}Examples{你的Qt版本}networkloopback

  • 相关链接
https://doc.qt.io/qt-5/qtnetwork-loopback-example.html

  • Qt君公众号回复『Qt示例』获取更多内容。

c++ qt获取电脑的内存_Qt官方示例-TCP客户端/服务器示例相关推荐

  1. c++ qt获取电脑的内存_Qt官方示例信号量

    ❝ 演示Qt多线程的信号量操作编程. ❞   生产者将数据写入缓冲区,直到到达缓冲区末尾为止,然后从头开始重新开始,覆盖现有数据.使用者线程读取生成的数据,并将其写入标准错误.   信号量比互斥量可以 ...

  2. c++ qt获取电脑的内存_QT开发(十四)——QT绘图系统

    一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngin ...

  3. qt获取combobox的值_Qt官方示例嵌套甜甜圈

    ❝ 本示例演示如何使用QPieSeries API创建嵌套的甜甜圈图. ❞ 创建嵌套甜甜圈图   先创建一个QChartView实例并启用抗锯齿.然后从QChartView实例获得一个QChart对象 ...

  4. 获取计算机最大磁盘,Qt获取电脑磁盘容量(示例代码)

    项目中用到了监测某磁盘(如:C盘.D盘等)的总容量和可用容量,查了一下,发现其实挺简单,调用一个Windows自带的API:GetDiskFreeSpaceEx( ... )就可以解决.用Qt做了一个 ...

  5. QT自制秒表计时器、可获取电脑时间

    自制秒表 功能 : 开始 停止 打点 重置 显示电脑当前日期与时间 界面 界面总共包含三种控件: Label Push Button Text Browser 三种控件分别用于以下显示: 3. 代码 ...

  6. 使用 Qt 获取 UDP 数据并显示成图片

    一个项目,要接收 UDP 数据包,解析并获取其中的数据,主要根据解析出来的行号和序号将数据拼接起来,然后将拼接起来的数据(最重要的数据是 R.G.B 三个通道的像素值)显示在窗口中.考虑到每秒钟要接收 ...

  7. C# 获取电脑的网络连接状态

    C# 获取电脑的网络连接状态 原文:C# 获取电脑的网络连接状态 判断连网的方法介绍 1. InternetGetConnectedState 此函数获取网络状态有延时,且对网卡伤害较大 MSDN官方 ...

  8. Python获取电脑硬件信息及状态的实现方法

    From: http://www.jb51.net/article/54470.htm 这篇文章主要介绍了Python获取电脑硬件信息及状态的实现方法,是一个很实用的技巧,需要的朋友可以参考下 本文以 ...

  9. linux qt 读系统信息,使用Qt获取系统版本

    获取Windows,Mac,IOS,Android,Linux等系统版本信息. Qt 4版本 可以获取到系统版本的变量或函数 头文件 #include 使用公有静态变量和静态方法获取Windows系统 ...

最新文章

  1. 中国AI开发者真实现状:写代码这条路,会走多久?
  2. Jsp实现网上定餐系统
  3. maven常用的命令(window控制台和linux命令是一致的)
  4. knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案
  5. SpringBoot四大核心之actuator——程序监控器
  6. mysql查询连续次数_Mysql如何查询连续的时间次数
  7. 走火入魔.NET从C/S单点登录到B/S系统的例子,SUID(System Unique Identification)
  8. 雷达人体存在感应器方案,智能物联网感知技术,实时感应人体存在
  9. Linux网卡状态查看
  10. Linux内核学习开始
  11. ceph 部署后rbd块设备读写只有10M左右,慢的更龟速一样,怎样解决!,求各位博友指点……,感激不尽……...
  12. 360无线路由器dns服务器,路由器的首选dns服务器怎么填
  13. 流程图 FlowChart
  14. (Win10+vs2017)配置OpenCV开发环境
  15. Java之数组实现增删改
  16. android 7.0 iso下载地址,iOS 7.0固件 全系列官方正式版下载地址
  17. Android系统架构与分层
  18. 34年的见证:从“用脚丈量”到“云端管理”
  19. PXE工作原理(有图有真相)
  20. STM8L 软件I2C读写操作

热门文章

  1. 11.MYSQL高级(一)
  2. 小案例:搭建简易版王者荣耀英雄购买商城网页版
  3. python中的进程, 线程
  4. 一阶电路暂态响应的结果分析。_阻尼比测试方法及谐响应分析
  5. 为什么搜索与推荐场景用AUC评价模型好坏?
  6. 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景
  7. 论文浅尝 - EMNLP2020 | 低资源跨语言实体链接中的设计挑战
  8. 美团大脑 | 知识图谱的建模方法及其应用
  9. 百度作业帮-产品分析
  10. 致力语言资源建设、常识推理的自然语言处理螺丝钉