我在运行同步显示例程的LAN上有一系列系统。例如,想一个合唱队。他们运行的程序是固定的。我有每个“客户”下载整个例程,然后联系中央“服务器”。在例程中的固定点进行同步。例程本身很平常,可能有20条可能的指示。

每个客户端都运行相同的例程,但它们可以在任何时候完成不同的事情。合唱线的一部分可以向左踢,另一部分向右踢,但是所有的时间都是相互的。客户可以随时加入和退出,但他们都被分配了一部分。如果没有人来运行该部件,它就不会运行。

这全部用C#.Net编码。

客户端显示是Windows窗体应用程序。服务器接受TCP连接,然后以循环方式为它们提供服务,保持主时钟的正常运行。客户端发送一个信号,表示“我已达到同步点32”。 (或19或5,或其他)等待服务器确认然后继续。或者服务器可以说“不,你需要从同步点15开始”。

这一切都很棒。在第一个和最后一个客户端之间有一个次要位延迟来达到同步点,但它几乎不可察觉。跑了几个月。

然后规格发生了变化。

现在客户需要响应来自服务器的近实时指令 - 它不再是预先设定的舞蹈节目。服务器将发送指令,舞蹈程序即时编组。我得到了重新设计协议,服务循环和编程指令的有趣工作。

我的工具包包含标准的.Net 3.5工具箱中的任何内容。安装新软件很麻烦,因为可以涉及很多系统(客户端)。

我正在寻找关于保持客户端同步的建议(某种锁存系统?UDP?广播?),“舞蹈程序”的分发,任何可能比传统的客户端/服务器TCP安排更容易的事情。

请记住,时间/速度限制也在继续。我可以将舞蹈程序放在网络数据库中,但我必须快速推送指令,并且有很多读者使用相当厚的协议(DBI,SqlClient等等)来获得一点点的文字。这似乎过于复杂。我需要一些东西让它们全部同步显示。

连连呢?意见?野驴猜测?代码示例?

PS:答案可能不会被标记为“正确” (因为这不是一个“正确的”答案),但+1票肯定是好的建议。

有帮助吗?

解决方案

我做了类似的事情(很久以前)同步了一组4个显示器,每个显示器由一个系统运行,从中央服务器接收消息。

我们在经过大量测试后最终确定的架构涉及一个“主人”。机。在您的情况下,这将使您的20个客户端中的一个充当主服务器,并通过TCP连接到服务器。

然后,服务器会将该系列的整个系列命令发送到那台机器。

然后,该机器使用UDP向其他每台机器(其LAN上的其他19台客户机)广播实时指令,以使其显示保持最新。我们在这里使用UDP有几个原因 - 涉及的开销较低,这有助于降低总资源使用率。此外,由于您正在实时更新,如果有一个或两个“帧”,它是不同步的,它从来都不是显而易见的,至少对于我们的目的来说不够明显(人类坐着并与系统交互)。

然而,这个工作顺利进行的关键是在主服务器和“主”服务器之间具有智能通信装置。机器 - 您希望尽可能降低带宽。在像你这样的情况下,我可能会想出一个二进制blob,它以最小的形式拥有20台机器的当前指令集。 (可能类似于20个字节,如果需要则可以是40个字节,等等)。 “主人”然后机器会担心将其转换为其他19台机器本身。

有一些很好的事情 - 服务器更容易传输到集群中的一台机器而不是集群中的每台机器。例如,这让我们有一个单独的集中式服务器“驱动器”。多个集群高效,无需任何地方的荒谬硬件要求。它还使客户端代码非常简单。它只需要监听UDP数据报并按照它所说的做 - 在你的情况下,听起来它会有20个命令之一,所以客户端变得非常非常简单。

“主人”服务器是最棘手的。在我们的实现中,我们实际上在其上具有与其他19(作为单独的过程)和一个“翻译”相同的客户端代码。把这个blob打成碎片,把它分成20块,然后传送它们。编写起来相当简单,并且工作得非常好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top