如何使用QThreads在多个QTcpSockets上写?

时间:2011-11-05 05:06:46

标签: qthread qtcpsocket

我在QTcpSockets和QThreads上遇到这个问题已经困难了几天。

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

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

我想在separe线程中执行所有套接字写入,以便我可以在paralel中发送数据。我知道我不能从另一个线程中调用一个套接字来创建一个套接字并且我不想为每个客户端使用一个线程,因为我不知道是否认为有很多线程(此外,除非客户端断开连接,否则这些线程应始终运行。)

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

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

请您指出正确的方向,或者给我一些关于如何实现并列插槽编写的提示,而不是每个客户端实际拥有一个线程......?

最诚挚的问候,

塞巴斯蒂安

1 个答案:

答案 0 :(得分:0)

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

根据许多细节,您可能更喜欢替代实施。在此实现中,每个套接字的发送逻辑有两种模式,排队和非排队。套接字开始没有排队。如果要发送到套接字,请获取保护它的锁。如果它处于排队模式,请将数据添加到队列中,然后就完成了。

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

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