1

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

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

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

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

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

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

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

最好的祝福,

塞巴斯蒂安

4

1 回答 1

0

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

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

If you're in unqueued mode, try to send the data with a non-blocking send. If you send all of it, you're done. Otherwise, save the unsent data to the queue and put the socket in queued mode.

You will need to arrange some mechanism to 'periodically' attempt to send data on the sockets in queued mode. Normally, you would do that with something like 'select' or 'poll'. With QTcpSockets, you have signals and slots.

于 2011-11-05T05:47:24.653 回答