文章目录

  • 1 Qt中的TCP客户端编程
    • 1.1 TCP客户端编程介绍
    • 1.2 QTcpSocket的同步编程
    • 1.3 QTcpSocket的异步编程

1 Qt中的TCP客户端编程

1.1 TCP客户端编程介绍

Qt中的客户端编程:

Qt中的TCP客户端编程:

  • 对于Qt编程而言,网络只是数据传输的通道。
  • Qt提供了QTcpSocket类(封装了TCP协议细节)。
  • 将QTcpSocket的对象当作黑盒使用,进行数据收发。

QTcpSocket的使用方式:

  1. 连接服务端主机(connectToHost)。
  2. 发送数据/接收数据(write()/read())。
  3. 关闭连接(close())。

QTcpSocket的注意事项:

  • 默认情况下,QTcpSocket使用异步编程的方式:

    • 操作完成后立即返回。
    • 通过发送信号的方式返回操作结果。
  • QTcpSocket提供了辅助函数,可完成同步编程的方式:
    • waitForConnected()/waitForDisconnected()
    • waitForBytesWritten()/waitForReadyRead()

**这种异步编程的实现原理是什么?是单独开了个线程吗?
**

发送缓冲区和接收缓冲区的概念:

发送缓冲区:

  • 数据先进入发送缓冲区,之后由操作系统送往远端主机。
  • flush()强制发送缓冲区中的数据立即被送走。

接收缓冲区:

  • 远端数据被操作系统接收后放入接收缓冲区。
  • bytesAvailable()获取接收缓冲区中数据的字节数。

1.2 QTcpSocket的同步编程

同步编程的步骤如下:

#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>
#include <QThread>void SyncClientDemo()
{QTcpSocket client;char buf[256] = {0};client.connectToHost("127.0.0.1", 8080);qDebug() << "Connected:" << client.waitForConnected();qDebug() << "Send Bytes:" << client.write("D.T.Software");qDebug() << "Send Status:" << client.waitForBytesWritten();qDebug() << "Data Available:" << client.waitForReadyRead();qDebug() << "Received Bytes:" << client.read(buf, sizeof(buf)-1);qDebug() << "Received Data:" << buf;client.close();// client.waitForDisconnected();
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);SyncClientDemo();return a.exec();
}

1.3 QTcpSocket的异步编程

QTcpSocket的异步编程:

  • QTcpSocket对象通过发送信号的方式返回操作结果。
  • 可以在程序中将对应信号连接到槽函数,获取结果。
  • 在GUI应用程序中通常使用QTcpSocket的异步方式。

QTcpSocket中的关键信号:

  • connected():成功连接远端主机。
  • disconnected():远端主机断开连接。
  • readyRead():远端数据到达本机。
  • bytesWritten(qint64):数据成功发送至系统(OS)。

实现代码如下:

ClientDemo.h:

#ifndef CLIENTDEMO_H
#define CLIENTDEMO_H#include <QObject>
#include <QTcpSocket>class ClientDemo : public QObject
{Q_OBJECTQTcpSocket m_client;
protected slots:void onConnected();void onDisconnected();void onDataReady();void onBytesWritten(qint64 bytes);public:ClientDemo(QObject* parent = NULL);void connectTo(QString ip, int port);qint64 send(const char* data, int len);qint64 available();void close();
};#endif // CLIENTDEMO_H

ClientDemo.cpp:

#include "ClientDemo.h"
#include <QHostAddress>
#include <QDebug>ClientDemo::ClientDemo(QObject* parent) : QObject(parent)
{connect(&m_client, SIGNAL(connected()), this, SLOT(onConnected()));connect(&m_client, SIGNAL(disconnected()), this, SLOT(onDisconnected()));connect(&m_client, SIGNAL(readyRead()), this, SLOT(onDataReady()));connect(&m_client, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}void ClientDemo::onConnected()
{qDebug() << "onConnected";qDebug() << "Local Address:" << m_client.localAddress();qDebug() << "Local Port:" << m_client.localPort();
}void ClientDemo::onDisconnected()
{qDebug() << "onDisconnected";
}void ClientDemo::onDataReady()
{char buf[256] =  {0};qDebug() << "onDataReady:" << m_client.read(buf, sizeof(buf)-1);qDebug() << "Data:" << buf;
}void ClientDemo::onBytesWritten(qint64 bytes)
{qDebug() << "onBytesWritten:" << bytes;
}void ClientDemo::connectTo(QString ip, int port)
{m_client.connectToHost(ip, port);
}qint64 ClientDemo::send(const char* data, int len)
{return m_client.write(data, len);
}qint64 ClientDemo::available()
{return m_client.bytesAvailable();
}void ClientDemo::close()
{m_client.close();
}

main.cpp:

#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>
#include <QThread>
#include "ClientDemo.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ClientDemo demo;char buf[] = "Hello!";demo.connectTo("127.0.0.1", 8080);demo.send(buf, sizeof(buf)-1);return a.exec();
}

考虑一下:如何主动断开连接呢?测试发现在析构函数中断开连接是不成功的!


参考资料:

  1. QT实验分析教程

Qt中的TCP客户端编程相关推荐

  1. Qt中的TCP/UDP编程

    网络编程,OSI(开放式系统互联参考模型)七层参考模型:应用层.表示层.会话层.传输层.网络层.数据链路层.物理层.     套接字(Socket)是网络通信的基本构建模块,又分为流式套接字(Stre ...

  2. QT -- TcpSocket实例,使用Qt中的tcp通信协议,构建客户端和服务端,实现局域网通信软件功能

    Qt中使用Tcp构建通信客户端实现聊天信息发送连接等 1.简介 2.项目创建和界面构建 1)流程图 2)项目构建 3)界面构建 3.代码设计 1)项目pro添加 2)客户端设计 a. clientwi ...

  3. android 之TCP客户端编程(转自杨奉武博客)

    android 之TCP客户端编程 补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务中进行, 如有问题请百度 thread或者看下面链接的文章 https:// ...

  4. 【计算机网络】Linux环境中的TCP网络编程

    文章目录 前言 一.TCP Socket API 1. socket 2. bind 3. listen 4. accept 5. connect 二.封装TCPSocket 三.服务端的实现 1. ...

  5. micropython中文社区 socket通讯_基于micropython的TCP客户端编程

    python概述 python现在是一门比较火的语言,如果能够使用python编写嵌入式的应用程序,那该有多好呀,现在micropython软件框架的出现,使得python进入了嵌入式领域. pyth ...

  6. Qt开发的TCP客户端和服务器

    前言 自己写的demo测试程序,已通过网络调试助手验证程序是可行的,该程序界面可以切换TCP客户端和服务器,可以接收和发送信息到网络调试助手,可以切换不同的语言,项目下载地址:https://down ...

  7. Qt中对TCP粘包的处理

    当时用TCP协议传输数据时,经常出现粘包的现象 当服务器向客户端发送数据之后,客户端还没有接收数据的时候,这段时间数据在什么地方? 1.服务器?服务器已经发出数据了 2.网线?数据应该在内存,怎么会在 ...

  8. android 之TCP客户端编程

    每一台电脑都有自己的ip地址,每台电脑上的网络应用程序都有自己的通信端口,张三的电脑(ip:192.168.1.104)上有一个网络应用程序A(通信端口8000),李四的电脑(ip:192.168.1 ...

  9. opc协议 服务器,使用OPC UA协议在python中进行服务器端客户端编程

    你想要完成什么?结构是相当重要的问题,因为你可以摆脱它. Onces它的安装运行的服务器并检查它witth他的命令行 opcua-client 这个GUI可能会帮助很多见的服务器的结构. opcua服 ...

最新文章

  1. ZOJ-2571 Big String Outspread 模拟
  2. Leetcode 560. Subarray Sum Equals K
  3. 蓝桥杯基础模块1:LED跑马灯
  4. 我的2006年,我的博客站
  5. 手机号中间四位星号显示
  6. springboot 整合腾讯云短信
  7. WIPE与Format的种种神马情况
  8. 服务器xfs数据丢失的数据恢复过程_服务器数据恢复方案
  9. STM32项目 -- 选题分享(2)(部分)
  10. 对Word文档中的指定内容进行替换
  11. 关于HTTP的几个个人预言
  12. 通过DNS2SOCKS建立本地稳定无污染DNS
  13. 分享6款好用并免费的远程管理工具
  14. Document读取XML
  15. 切蛋糕(洛谷P1714)
  16. 手机h5页面唤起打电话、发短信功能
  17. 对DB,DBMS的理解
  18. Java 导入zip,并进行解压
  19. arcgis上下标问题
  20. 零电压转换PWM电路(软开关)

热门文章

  1. lis3dh 三轴加速度计 运动检测 中断配置实现
  2. 查看DLL 及LIB 库导出函数方法
  3. u-boot分析之启动简介(一)
  4. TCL with SNPS file existsfile rename/copy redirect lsearch split
  5. 三星T5 SSD制作ubuntu18.04随身携带即插即用与win10共享文件真爽~(简单粗暴安装大法一步到位)
  6. 【树莓派】小空间树莓派镜像系统备份方法img镜像文件压缩方法
  7. 详解「递归」正确的打开方式
  8. 密码协议(三)裁决协议和自动执行协议
  9. iOS 蓝牙开发和注意点
  10. 进程外Session和进程内Session存储