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

QTcpSocket和QLocalSocket详解

QTcpSocket

QTcpSocket 是 Qt 网络模块中用于处理 TCP 连接的类,提供了一个高层次的 API 来进行 TCP 客户端的通信。它继承自 QAbstractSocket,可以方便地用于在客户端和服务器之间发送和接收数据。

主要功能:

  • 连接到服务器QTcpSocket 可以通过 connectToHost() 方法连接到远程服务器的指定地址和端口。
  • 发送和接收数据:使用 write()read() 方法进行数据传输。write() 将数据发送到远程服务器,而 read() 从服务器接收数据。
  • 异步通信QTcpSocket 支持非阻塞模式,所有的操作都是异步的。当数据到达时,会触发相关的信号,诸如 readyRead() 用于通知数据可读。
  • 状态管理:你可以通过 state() 方法来检查当前套接字的状态(例如,是否连接、已关闭等)。

常用方法:

  • connectToHost(const QString &hostName, quint16 port):连接到远程主机。
  • disconnectFromHost():断开与远程主机的连接。
  • write(const QByteArray &data):向远程主机发送数据。
  • read(qint64 maxSize):从远程主机接收数据。
  • bytesAvailable():返回可以读取的字节数。

常用信号:

  • connected():当连接建立时触发。
  • disconnected():当连接断开时触发。
  • readyRead():当有数据可读时触发。

代码示例:

下面是一个简单的使用 QTcpSocket 连接到服务器并发送数据的例子:

QTcpSocket *socket = new QTcpSocket(this);

// 连接到服务器
socket->connectToHost("example.com", 1234);

if(socket->waitForConnected(3000)) {
    qDebug() << "Connected!";

    // 发送数据
    socket->write("Hello, Server!");
    socket->waitForBytesWritten(1000);
    socket->waitForReadyRead(3000);

    // 读取响应数据
    qDebug() << "Reading:" << socket->bytesAvailable();
    qDebug() << socket->readAll();

    // 断开连接
    socket->disconnectFromHost();
    socket->waitForDisconnected(3000);
}

在这个示例中,QTcpSocket 连接到服务器 example.com 的端口 1234,然后发送数据并等待响应。

使用场景:

  1. 客户端应用程序:例如聊天客户端、游戏客户端等需要连接远程服务器的应用。
  2. 数据采集:当客户端需要与远程的 TCP 服务器进行数据交换时,QTcpSocket 是理想的工具。
  3. 实时通信:当需要持续与服务器保持连接并频繁通信时(例如金融交易应用),QTcpSocket 可以帮助简化处理。

通过 QTcpSocket,可以方便地进行可靠的双向通信,适合构建各种 TCP 客户端应用。

QLocalSocket

QLocalSocket 简介

QLocalSocket 是 Qt 中用于在同一台设备上的进程间通信(IPC,Inter-Process Communication)的类,它通过本地套接字实现。与 QTcpSocket 不同,QLocalSocket 专门用于本地的通信,而不涉及网络协议。

主要功能:

  • 本地通信QLocalSocket 提供了类似 QTcpSocket 的接口,但它只在本地的进程之间通信,不通过网络传输数据。
  • QLocalServer 配合使用:在本地通信中,QLocalSocket 作为客户端,与 QLocalServer 配合,允许多个本地进程相互通信。
  • 跨平台支持:在支持本地套接字的操作系统(如 Unix 系统中的 Unix 域套接字,或 Windows 中的命名管道)上,QLocalSocket 提供统一的 API 进行进程间通信。

常用方法:

  • connectToServer(const QString &name):连接到本地的服务器(由 QLocalServer 创建)。
  • disconnectFromServer():断开与本地服务器的连接。
  • write(const QByteArray &data):向本地服务器发送数据。
  • read(qint64 maxSize):从本地服务器接收数据。

常用信号:

  • connected():连接到本地服务器时触发。
  • disconnected():与本地服务器断开时触发。
  • readyRead():当有数据可以读取时触发。

QLocalSocket 示例:

以下是一个 QLocalSocket 客户端连接到本地服务器的简单示例:

QLocalSocket *socket = new QLocalSocket(this);

// 连接到本地服务器
socket->connectToServer("my_local_server");

if(socket->waitForConnected(3000)) {
    qDebug() << "Connected to local server!";

    // 发送数据
    socket->write("Hello, Local Server!");
    socket->waitForBytesWritten(1000);
    socket->waitForReadyRead(3000);

    // 读取响应
    qDebug() << "Reading:" << socket->bytesAvailable();
    qDebug() << socket->readAll();

    // 断开连接
    socket->disconnectFromServer();
}

QLocalSocketQTcpSocket 的区别:

  1. 通信范围
    • QLocalSocket:仅限于本地进程之间通信,不涉及网络,使用本地套接字或命名管道。
    • QTcpSocket:用于通过网络在客户端和远程服务器之间通信,遵循 TCP 协议。
  2. 使用场景
    • QLocalSocket:适用于同一台设备上的进程间通信,常用于进程间数据传输、控制进程间消息传递等。例如,桌面应用的不同模块之间通信,或者父子进程之间的信息传递。
    • QTcpSocket:用于通过 TCP 网络连接远程服务器,适用于网络通信场景,比如 Web 服务、远程数据库连接等。
  3. 性能
    • QLocalSocket:由于不涉及网络传输,通常比 QTcpSocket 快,延迟更低,适合高效的本地数据传输。
    • QTcpSocket:由于涉及网络传输,存在更多的不确定因素(例如带宽、延迟),通信速度取决于网络条件。
  4. 底层协议
    • QLocalSocket:在不同的平台上实现不同。Unix 系统上使用 Unix 域套接字,而 Windows 上使用命名管道。
    • QTcpSocket:基于 TCP/IP 协议,用于远程网络通信。

使用场景比较:

  • QLocalSocket:假设你有一个桌面应用程序,由多个模块或进程组成,彼此需要交换状态信息或数据,那么 QLocalSocket 可以作为本地进程间通信的方式。
  • QTcpSocket:如果你需要构建一个客户端应用程序与远程服务器通信(如聊天应用、远程数据采集等),QTcpSocket 是更合适的选择。

总结来看,QLocalSocket 是为本地通信优化的工具,而 QTcpSocket 则是面向网络通信的广泛用途的套接字类。选择哪个类取决于你是否需要在本地或远程进行通信。


http://www.kler.cn/news/312535.html

相关文章:

  • 【网络编程】socket套接字|sockaddr|sockaddr_in|通信过程
  • 《深度学习》—— 神经网络模型中的损失函数及正则化惩罚和梯度下降
  • 如何搭建虚拟机Ubuntu?
  • icpc江西:L. campus(dij最短路)
  • el-input 只能输入数字和一个小数点,或者只能输入两位小数
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】
  • 探索自闭症寄宿学校的专属教育模式
  • java原子操作类
  • 基于LSTM的文本摘要生成实战教程
  • Python学习的主要知识框架
  • 同样实用的CSS剪裁属性clip-path
  • esp32-C2 对接火山引擎实现语音转文本(二)
  • Windows安装启动:stable-diffusion-webui,AIGC大模型文生图、文生视频,Python
  • 使用mlp算法对Digits数据集进行分类
  • 必应bing广告优势,国内开户注意事项备忘录
  • Windows系统 Bat命令生成快捷方式
  • LLM - 理解 多模态大语言模型(MLLM) 的 指令微调(Instruction-Tuning) 与相关技术 (四)
  • 【例题】lanqiao3225 宝藏排序Ⅰ
  • 2-100 基于matlab的水果识别
  • 【诉讼流程-健身房-违约-私教课-诉讼书提交流程-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(3)】
  • spring MVC 拦截器
  • 本地git仓库配置远程仓库的地址
  • el-table的树形结构结合多选框使用,实现单选父子联动,全选,反选功能
  • SpringBoot结合Mybatis-plus项目直接执行sql语句
  • Vue学习记录之五(组件/生命周期)
  • IO流体系(FiletOutputStream)
  • Go Testify学习与使用
  • Linux环境变量进程地址空间
  • 毕业设计选题:基于springboot+vue+uniapp的驾校报名小程序
  • MySQL从入门到精通二