Qt中的TCP客户端编程
文章目录
- 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的使用方式:
- 连接服务端主机(connectToHost)。
- 发送数据/接收数据(write()/read())。
- 关闭连接(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();
}
考虑一下:如何主动断开连接呢?测试发现在析构函数中断开连接是不成功的!
参考资料:
- QT实验分析教程
Qt中的TCP客户端编程相关推荐
- Qt中的TCP/UDP编程
网络编程,OSI(开放式系统互联参考模型)七层参考模型:应用层.表示层.会话层.传输层.网络层.数据链路层.物理层. 套接字(Socket)是网络通信的基本构建模块,又分为流式套接字(Stre ...
- QT -- TcpSocket实例,使用Qt中的tcp通信协议,构建客户端和服务端,实现局域网通信软件功能
Qt中使用Tcp构建通信客户端实现聊天信息发送连接等 1.简介 2.项目创建和界面构建 1)流程图 2)项目构建 3)界面构建 3.代码设计 1)项目pro添加 2)客户端设计 a. clientwi ...
- android 之TCP客户端编程(转自杨奉武博客)
android 之TCP客户端编程 补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务中进行, 如有问题请百度 thread或者看下面链接的文章 https:// ...
- 【计算机网络】Linux环境中的TCP网络编程
文章目录 前言 一.TCP Socket API 1. socket 2. bind 3. listen 4. accept 5. connect 二.封装TCPSocket 三.服务端的实现 1. ...
- micropython中文社区 socket通讯_基于micropython的TCP客户端编程
python概述 python现在是一门比较火的语言,如果能够使用python编写嵌入式的应用程序,那该有多好呀,现在micropython软件框架的出现,使得python进入了嵌入式领域. pyth ...
- Qt开发的TCP客户端和服务器
前言 自己写的demo测试程序,已通过网络调试助手验证程序是可行的,该程序界面可以切换TCP客户端和服务器,可以接收和发送信息到网络调试助手,可以切换不同的语言,项目下载地址:https://down ...
- Qt中对TCP粘包的处理
当时用TCP协议传输数据时,经常出现粘包的现象 当服务器向客户端发送数据之后,客户端还没有接收数据的时候,这段时间数据在什么地方? 1.服务器?服务器已经发出数据了 2.网线?数据应该在内存,怎么会在 ...
- android 之TCP客户端编程
每一台电脑都有自己的ip地址,每台电脑上的网络应用程序都有自己的通信端口,张三的电脑(ip:192.168.1.104)上有一个网络应用程序A(通信端口8000),李四的电脑(ip:192.168.1 ...
- opc协议 服务器,使用OPC UA协议在python中进行服务器端客户端编程
你想要完成什么?结构是相当重要的问题,因为你可以摆脱它. Onces它的安装运行的服务器并检查它witth他的命令行 opcua-client 这个GUI可能会帮助很多见的服务器的结构. opcua服 ...
最新文章
- ZOJ-2571 Big String Outspread 模拟
- Leetcode 560. Subarray Sum Equals K
- 蓝桥杯基础模块1:LED跑马灯
- 我的2006年,我的博客站
- 手机号中间四位星号显示
- springboot 整合腾讯云短信
- WIPE与Format的种种神马情况
- 服务器xfs数据丢失的数据恢复过程_服务器数据恢复方案
- STM32项目 -- 选题分享(2)(部分)
- 对Word文档中的指定内容进行替换
- 关于HTTP的几个个人预言
- 通过DNS2SOCKS建立本地稳定无污染DNS
- 分享6款好用并免费的远程管理工具
- Document读取XML
- 切蛋糕(洛谷P1714)
- 手机h5页面唤起打电话、发短信功能
- 对DB,DBMS的理解
- Java 导入zip,并进行解压
- arcgis上下标问题
- 零电压转换PWM电路(软开关)
热门文章
- lis3dh 三轴加速度计 运动检测 中断配置实现
- 查看DLL 及LIB 库导出函数方法
- u-boot分析之启动简介(一)
- TCL with SNPS file existsfile rename/copy redirect lsearch split
- 三星T5 SSD制作ubuntu18.04随身携带即插即用与win10共享文件真爽~(简单粗暴安装大法一步到位)
- 【树莓派】小空间树莓派镜像系统备份方法img镜像文件压缩方法
- 详解「递归」正确的打开方式
- 密码协议(三)裁决协议和自动执行协议
- iOS 蓝牙开发和注意点
- 进程外Session和进程内Session存储