【发布时间】:2021-06-15 16:47:21
【问题描述】:
我目前正在编写一个应该指示多个客户端的服务器应用程序。 我不确定我设计的概念并希望收到有关它的反馈。
有几个相同的客户端记录和处理传感器数据。此外,将结果发送到服务器,以便服务器可以在必要时做出反应并向客户端发送新参数。 客户端应在连接结束后继续工作,同时尝试重新连接。如果没有连接,则不必随后传输数据。
我的概念如下:
The client logs on to the server.
The client requests an initialization -> server ok.
The client requests parameter A -> server sends parameter
The client requests parameter B -> server sends parameter
...
The client requests parameter Z -> server sends parameter
The client sends initialization finished -> server says ok
endless loop
Server queries measured value X -> client sends measured value
Server sends parameter Y -> client says ok.
所以首先客户端是主控,并要求它需要的初始化参数,然后服务器和客户端交换角色,服务器成为主控。
如果连接中断,客户端应该重新连接到服务器。但随后会使用以下命令:
The client sends initialization finished -> server says ok
启动以便跳过初始化。
参数请求运行如下:
Infinite loop
Send (command)
Timout = 1 second
Receive
if (! Timout)
break
所以我发送命令并稍等,如果没有答案,我再次发送命令。此处以缩写形式显示。我用 c ++ 编写了它,并使用了几个状态机。状态机自然也会在连接中断的时候捕捉到错误,跳回初始化状态……
由于这是一个多客户端应用程序,我觉得有点困难。它作为单个客户端运行。我有一个存储状态机和套接字的类客户端。该实例在单独的线程中运行。 我现在的问题是,如果连接丢失,我如何建立一个新的连接(从旧客户端)到它的实例(状态机)。我会通过一些 id 比较来做到这一点。以便客户首先发送他的ID。 (也许还有mac地址???)
我目前保持与所有客户端的连接始终打开。那是最先进的吗?还是应该发送命令,等待应答并再次关闭连接,然后在必要时重新连接?
非常感谢
【问题讨论】:
-
unordered_map<client_id, client_state>?