使用QTcpServer / QTcpSocket

时间:2018-02-27 11:28:04

标签: multithreading qt sockets

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

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

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

到目前为止的故事

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

到目前为止,一切都在顺利运作。

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

当用户发送"重处理请求时,会发生什么? (在用ack回答之前可以简化5秒休眠),客户端也发送周期性看门狗消息(比方说,每秒),但是在服务器端我只得到处理时的新dataReady()信号。终止。

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

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

1 个答案:

答案 0 :(得分:0)

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