【问题标题】:How to write on multiple QTcpSockets using QThreads?如何使用 QThreads 在多个 QTcpSockets 上写入?
【发布时间】:2011-12-22 12:42:59
【问题描述】:

我已经在 QTcpSockets 和 QThreads 上为这个问题苦苦挣扎了几天。

我有一个 QTcpServer,它侦听一个端口并使用 nextPendingConnection() 创建一个新客户端。所以现在客户端有了一个qtcpsocket,我可以用它来读写。

假设我有 100 个客户端连接到我的服务器。当其中一个想要向所有人广播消息时,我的主线程(我在其中使用 nextPendingConnection() 创建客户端)将不得不迭代 100 多个客户端并在其套接字上调用 write 方法。例如,如果有 10 个用户同时广播,我将不得不进行 1000 次迭代,所以我认为客户端会有一些延迟(当用户收到消息时)。

我想在单独的线程中编写所有套接字,以便我可以并行发送数据。我知道我不能从创建它的线程调用另一个线程的套接字,我不想每个客户端使用一个线程,因为我不知道拥有很多线程是否是个好主意(此外,这些线程应始终运行,除非客户端断开连接)。

我已经阅读了线程财富服务器示例,但它没有回答我的问题,因为它们在发送数据后破坏了套接字;我不想破坏我的套接字,因为我必须监听传入的消息(所以我可以广播它们)。

我想到的一件事是为每个客户端(在服务器和客户端)有 2 个套接字;这样我就可以保留一个套接字供阅读,而另一个我可以像在线程财富服务器示例中一样使用;在这种情况下,我还会使用线程池来限制任务的数量(否则这将与每个客户端使用一个线程相同)。

能否请您指出正确的方向或给我一些关于如何在每个客户端实际上没有一个线程的情况下实现并行套接字写入的提示...?

最好的问候,

塞巴斯蒂安

【问题讨论】:

    标签: qthread qtcpsocket


    【解决方案1】:

    具有将数据写入特定套接字的“WriteToSocket”函数。此外,有一个队列保存绑定到套接字的数据,受互斥锁保护。在函数中,将要发送的数据添加到套接字的队列中。检查套接字是否已分配给线程(为此保留一个标志)。如果是这样,你就完成了。如果没有,将作业安排到线程池以将数据发送到套接字。

    根据很多细节,您可能更喜欢替代实现。在这个实现中,每个套接字的发送逻辑有两种模式,排队和非排队。套接字开始未排队。当你想发送到一个套接字时,获取保护它的锁。如果它处于队列模式,将数据添加到队列中就完成了。

    如果您处于非排队模式,请尝试使用非阻塞发送方式发送数据。如果你把所有的都寄出去,你就完成了。否则,将未发送的数据保存到队列中,并将套接字置于队列模式。

    您需要安排一些机制来“定期”尝试以队列模式在套接字上发送数据。通常,您会使用“select”或“poll”之类的东西来做到这一点。使用 QTcpSockets,您拥有signals and slots

    【讨论】:

    • 您好,感谢您的回答。我认为您的解决方案非常好,但我真的不知道如何实施。假设我的 tcpsocket(仅用于读取)发出 readyRead() 信号;在一个单独的线程中,我必须写入数据以发送给每个写入套接字队列中的所有用户,然后另一个线程实际上会将排队的数据写入套接字。我可能误解了你的解释...我会努力实现它,我会发布一些消息...再次非常感谢--Seb--
    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多