Qt TCP Socket读取问题

Posted

技术标签:

【中文标题】Qt TCP Socket读取问题【英文标题】:Qt TCP Socket reading issue 【发布时间】:2015-02-26 10:36:37 【问题描述】:

我尝试使用 Qt 库和 GUI 程序读取 TCP 端口。

问题是当我使用这段代码读取套接字时:

QTcpSocket *a = new QTcpSocket();
a->connectToHost("127.0.0.1", 5000);
a->read(data,LEN);

它不起作用,我需要添加一个额外的功能:

a->waitForReadyRead(1)

但是这个函数会减慢我的程序,我使用pthread 来连续运行这个代码。我有一个问题,我怎样才能加快我的程序并成功读取数据?

【问题讨论】:

【参考方案1】:

您需要使用 Qt 事件循环并连接“可用数据”事件信号才能异步读取套接字数据。您的连接语法可能如下所示:

QObject::connect(s, &QTcpSocket::readyRead, yourReaderFunction);

您的程序循环应该包含对事件处理函数QApplication::processEvents() 的调用,或者您可以使用内置循环QApplication::exec()

信号和槽机制是Qt的核心特性,你需要正确理解和使用它才能与大多数Qt类进行交互:

Signal and slot basics

Qt5 new signal and slot syntax

【讨论】:

我知道你是什么意思,我用这种方式但是在一个线程中我认为我无法访问其余程序的内存。 另外一个问题是,当读取运行速度快于进程并且连接事件信号不在要同步的线程中时,我是否会丢失数据? @ntosis 您可能想要编辑您的问题以显示线程代码。您可以从创建套接字的线程访问套接字(因为 Qt 将 assert 否则,无论您的互斥或其他自旋线程安全功能如何),而且制作起来并非易事确保在您认为的线程中创建套接字,并为排队的连接使用正确的事件循环和上下文。 @NicolasHolthaus 我做了一些测试,它正在工作,我可以复制数据,但是信号 readyRead 在很长一段时间后发出,这非常糟糕。我认为它不是来自 Qt 但我使用 Rtl_Tcp 脚本我认为这个脚本很慢或者我这次无法想象的东西。 @ntosis 这已经远远超出了您最初问题的范围。如果您需要其他帮助,我无法从您所说的内容中判断出来,但如果需要,您可能需要提出另一个包含所有相关信息的问题。

以上是关于Qt TCP Socket读取问题的主要内容,如果未能解决你的问题,请参考以下文章

QT创建TCP Socket通信

Qt Socket网络编程

QT 套接字不读取所有数据

qt的tcp通信 服务器和客户端读写数据的问题

Qt学习第四天

Java中使用Socket连接判断Inputstream结束,java tcp socket服务端,python tcp socket客户端