当前位置: 首页 > news >正文

QTcpSocket使用指南与实践

QTcpSocket 深度解析与实践指南

一、QTcpSocket 概述

QTcpSocket是Qt Network模块提供的TCP协议网络通信类,继承自QAbstractSocket,用于实现TCP客户端功能。它与QTcpServer配合使用,支持流式数据传输,提供面向连接的可靠通信。

核心特性:

  • 基于事件驱动的异步IO模型

  • 支持IPv4/IPv6双协议栈

  • 提供SSL/TLS加密支持(需QSslSocket)

  • 跨平台统一接口(Windows/Linux/macOS)

二、基础使用流程

1. 创建Socket对象

QTcpSocket *socket = new QTcpSocket(parent);

2. 连接服务器

socket->connectToHost("127.0.0.1", 8888);

3. 信号处理

关键信号绑定:

// 连接成功
connect(socket, &QTcpSocket::connected, 
        [](){ qDebug() << "Connected!"; });

// 收到数据
connect(socket, &QTcpSocket::readyRead,
        [=](){ handleData(socket); });

// 断开连接
connect(socket, &QTcpSocket::disconnected,
        [](){ qDebug() << "Disconnected!"; });

// 错误处理
connect(socket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
        [](QAbstractSocket::SocketError error){
            qDebug() << "Error:" << error;
        });

4. 发送数据

QByteArray data = "Hello Server!";
socket->write(data);
// 确保立即发送
socket->flush(); 

5. 接收数据

推荐处理方式:

void handleData(QTcpSocket* socket) {
    while(socket->bytesAvailable() > 0) {
        QByteArray buffer = socket->readAll();
        processData(buffer);
    }
}

三、完整客户端示例

class TcpClient : public QObject {
    Q_OBJECT
public:
    explicit TcpClient(QObject *parent = nullptr)
        : QObject(parent) {
        socket = new QTcpSocket(this);
        
        connect(socket, &QTcpSocket::connected, [this](){
            qInfo() << "Connected to server";
            socket->write("Client Ready\n");
        });

        connect(socket, &QTcpSocket::readyRead, [this](){
            QByteArray data = socket->readAll();
            qInfo() << "Received:" << data;
        });

        connect(socket, &QTcpSocket::disconnected, [this](){
            qWarning() << "Connection closed";
        });
    }

    void connectToServer(const QString &host, quint16 port) {
        qInfo() << "Connecting to" << host << ":" << port;
        socket->connectToHost(host, port);
    }

private:
    QTcpSocket *socket;
};

http://www.dtcms.com/a/49272.html

相关文章:

  • 30秒从零搭建机器人管理系统(Trae)
  • flutter集成华为推送(Android)
  • uploadlabs经验总结
  • 将 SSH 密钥添加到 macOS 的钥匙串中
  • 拉格朗日对偶性(Lagrangian Duality)详解
  • Windows创建密钥并登录linux服务器
  • 软考备考 - 经验篇
  • 建筑兔零基础自学python记录37|编程练习3
  • 网络安全ctf试题 ctf网络安全大赛真题
  • C语言_数据结构总结1:静态分配方式的顺序表
  • 记一次ScopeSentry搭建
  • DAV_postgresql_4-pg安装
  • 文件操作核心概念总结
  • 鸿蒙中打开相机相册
  • AIGC时代:如何快速搞定Spring Boot+Vue全栈开发
  • *基础算法(1)
  • Linux之df命令
  • 网络安全工作怎么样?
  • 【CPU】Hart ID是什么(草稿)
  • AutoGen学习笔记系列(三)Tutorial - Agents
  • 深拷贝 浅拷贝防御性拷贝
  • 每日一题洛谷普及/提高-P1154 奶牛分厩c++
  • SAP MDG —— MDG on S/4HANA 2023 FPS03 创新汇总
  • mapbox进阶,使用点类型geojson加载symbol符号图层,用于标注带图标的注记,且文字居中在图标内,图标大小自适应文字
  • html | 预览一个颜色数组
  • OpenHarmony文件管理子系统
  • Kubernetes集群部署实战:从零到英雄
  • 【Flutter】正方形的Dialog
  • 通俗易懂的聚类算法之K均值详解
  • 嵌入式开发:磁通门传感器开发(4):自然环境中的磁场