使用QTcpServer / QTcpSocket管理来自单个客户端的并发请求

问题描述 投票:1回答:1

我需要创建一个TCP客户端/服务器应用程序,其中(单个)客户端按照用户命令向服务器发送请求,但也需要定期的“看门狗”消息。监视程序消息需要在没有延迟的情况下从服务器处理;如果服务器正在处理仍然处理先前的“重”请求,当看门狗请求到达时,它必须能够ASAP应答新请求(阻止当前处理,应答看门狗请求(仅回声),继续处理)。

获得此类行为的最佳方法是什么?

我已经阅读了几个主题,但我不确定要遵循哪一个来获得理想的行为。

到目前为止的故事

我有(单)客户端/服务器Qt应用程序。我正在使用信号/插槽来异步管理通信。客户端发送请求,服务器在接收数据时向应用程序发出信号,应用解析请求并执行操作,然后确认请求。假设客户端发送单个请求,在发送新请求之前等待ack / nack。

到目前为止,一切都在完美运作。

现在我必须添加一个“看门狗”命令,它将由客户端定期发送(例如使用QTimer),打破“单个消息”的假设。由于信号/插槽Qt管理,它认为它将开箱即用;原来并不是那么简单......

当用户发送“重处理请求”(可以在用ack回答之前简化5秒休眠)时,客户端也会发送定期监视消息(比如每秒),但是在服务器上发生的情况是只有当处理终止时,我才会得到一个新的dataReady()信号。

我通过moveToThread(无法使用它;仍然从“不同线程发出的”套接字错误)或通过子类化QTread(工作,但仍然阻塞)读到线程套接字。

我不会提供代码片段(目前),因为它很长,即使是最小的例子。首先,我会问你最好的方法是什么。

multithreading qt sockets
1个回答
0
投票

如果您的服务器是单线程的,并且您在其插槽中处理大量请求,则readyRead()信号在收到消息时会在消息循环中排队(因为一次只能处理一个插槽)并且在当前插槽完成之前不会被处理,因此服务器无法同时响应ping。您可以1)在处理大量请求时调用qApp->processEvents();或2)将处理移动到另一个线程(使用worker)。我会使用第二个选项,因为代码更具可读性(在我看来)。根据经验:如果你想要一些响应(gui,服务器等) - 将重物移开。这是第二种方法的粗略实施:https://github.com/mugiseyebrows/concurrent-requests

© www.soinside.com 2019 - 2024. All rights reserved.