从多个 tcp 连接读取数据

Reading data from multiple tcp connection

本文关键字:读取 数据 连接 tcp      更新时间:2023-10-16

考虑有 200 个检测器通过 tcp 套接字连接到程序的情况。他们经常发送他们的数据和 我想尽可能有效地处理它。

我可以想到 2 种方法来解决这个问题,但我对 QT 很陌生,所以我不知道哪一种更好,如果有的话。

创建一个线程池
  1. ,该线程池将运行从 QRunnable(( 派生的 200 个对象,每个对象将由一个套接字和将连接到此套接字信号的插槽组成,以便有关一个检测器的所有数据都将在该对象中处理。(在它的run((方法中会有QEventLoop(

  2. 创建 200 个对象
  3. ,每个对象将由套接字组成,并将这 200 个套接字信号连接到主线程中的一个插槽。因此,它将在一个插槽中处理来自 200 个探测器的数据。

哪种方法可以更好地解释在第一种方法中将创建 200 个 QEventLoop(为每个对象(的事实?

没有必要直接去投票。例如,您可以使用像uvw这样的专用产品。

我认为任何解决方案都可以工作,尽管我绝对建议避免使用每个连接线程的解决方案,因为 200 个线程大约 198 个线程太多了,效率不高。

我这样做的方法是创建一个线程并在该线程内运行一个 select(((或 poll(( 或 epoll(( 或其他(事件循环,以使用非阻塞 I/O 处理那里的 200 个 TCP 连接。 当数据到达该线程时,该线程可以将数据解析为适当的块,然后通过排队信号/插槽连接(或 qApp->postEvent(( 如果您喜欢这样做,请将解析/组装的数据发送到主线程(如有必要(。 (在单独的线程中进行网络将有助于防止 GUI 操作干扰网络性能,反之亦然(

在网络线程中创建~200个QTCPSocket对象(并让网络线程运行Qt标准QEventLoop来处理它们(也可能工作得很好;上次我尝试时,我遇到了一些性能问题,Qt在某些平台上实现网络,但那是在Qt4时代,所以我乐观地认为Qt从那时起提高了他们的实现效率。

在所有情况下,您都不希望线程数超过逻辑处理器内核数。跨线程分布对象。使用旋转事件循环的QRunnable是相当没有意义的,即使我承认在某人的请求的 SO 答案中演示了它。Eventloop也不便宜 - 每个都需要几千字节的堆栈,至少在我的平台上是这样。因此,最好只使用每个线程具有单个事件循环的QThread,然后以循环方式在线程之间分发网络对象。