我目前正在编写一个服务器应用程序,它应该指导多个客户端。 我不确定我设计的概念,并希望收到有关它的反馈。
有几个相同的客户端记录和处理传感器数据。此外,结果将发送到服务器,以便服务器在必要时做出反应并向客户端发送新参数。 客户端应该在连接结束后继续工作,同时尝试重新连接。如果没有连接,则无需后续传输数据。
我的概念如下:
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.
所以首先客户端是 master 并询问它需要的初始化参数,然后服务器和客户端交换角色,服务器成为 master。
如果连接中断,客户端应该重新连接到服务器。但随后会使用以下命令:
The client sends initialization finished -> server says ok
start 以便跳过初始化。
参数请求运行如下:
Infinite loop
Send (command)
Timout = 1 second
Receive
if (! Timout)
break
所以我发送命令并稍等,如果没有回答,我再次发送命令。此处以缩写形式显示。我用 C++ 写的,我使用了几个状态机。状态机自然也会在连接中断时捕获错误并跳回到初始化状态......
由于这是一个多客户端应用程序,我觉得有点困难。它作为单个客户端运行。我有一个类客户端,其中存储了一个状态机和一个套接字。该实例在单独的线程中运行。 我现在的问题是,如果连接丢失,我如何建立到其实例(状态机)的新连接(从旧客户端)。我会通过一些 id 比较来做到这一点。以便客户端首先发送他的 id。 (也许还有mac地址???)
我目前始终保持与所有客户端的连接。这是最先进的吗?还是应该发送命令,等待回答并再次关闭连接,然后在必要时重新连接?
非常感谢
答案 0 :(得分:0)
一旦TCP连接建立 每一方都可以发送数据。 只是你必须得到正确的写入-> 读取顺序。 这可以使用非阻塞套接字 IO 轻松实现。
<块引用>“我现在的问题是,如果连接丢失,我如何建立一个 新连接(从旧客户端)到它的实例(状态机)。一世 会通过一些 id 比较来做到这一点。以便客户发送他的 id 首先。 (也许还有mac地址???)”
一种解决方案是每个客户端都有一个 UUID,客户端每次连接它的 ID 时都必须告诉服务器,服务器可以保留 UUID 与客户端套接字连接的映射。
如果客户端丢失,服务器可以删除映射。服务器和客户端都可以检测到丢失的连接,这应该不是问题。