我有一个TCP客户端程序,需要与嵌入在设备中的服务器通信。 可能有1000个设备需要通过单个客户端程序进行控制。由于这些设备(即tcp服务器)的数量很大,因此它们必须位于不同的路由器之后
所以scenerio就像
客户端-----“router1”---- server1,server 2,server3 ... server_255
----- "router2" ---server1, server 2...server_255
由于客户端和服务器程序位于不同的网络中,因此这是在客户端和服务器之间建立通信的最简单方法吗?
虽然看起来简单的客户端 - 服务器编程,但问题是NAT,网络翻译在这里。服务器位于不同的专用网络之后 所以我期待在这里解决NAT问题。 (例如端口转发,但不确定)
注意:我的客户端和设备仍在我的网络中,因此安全性不是主要问题。
非常感谢提前。
答案 0 :(得分:3)
最直接的设计是拥有一个专用的守护程序进程,通常称为控制器,在一个众所周知的端口上侦听,所有设备都作为客户端,连接到它。控制器会监视设备上下移动,跟踪它们的位置和状态。
您现在称之为“客户端”的东西将成为用户界面的一部分。它将查询控制器并显示结果,并向控制器发出命令,然后控制器将命令转发给设备。
答案 1 :(得分:2)
让所有“服务器”(即设备)保持与“客户端”(即中央服务器)的连接。正如您所描述的那样,走另一条路,将无法使用路由器。
如果不需要全时连接,则可能需要建立连接计划或使用广播/多播消息来告知客户端连接。请注意,广播/多播将需要更改路由器配置,以确保消息熄灭。
我在这里假设通过路由器你的意思是NAT中的东西。 NAT是这里的问题。
答案 2 :(得分:2)
您的插图显示了每个基于NAT的路由器后面的多个端点。如果您使用的是端口转发方法,那么您需要为各种路由器中的每个端点注册不同的端口号。跟踪和配置会很麻烦,但会让您的中央管理服务器立即访问您的每个端点。
如果您控制端点上的软件,则可以让他们轮询中央服务器以获取指示。路由器中不需要配置,因为请求来自私有端。假设来自服务器的典型消息类似于“OK”,则流量将是微不足道的。缺点是中央服务器传送指令不是即时的。在下一个轮询间隔之前,客户端将不知道消息是否可用。
在两个极端之间,但需要增加成本,是一种分布式管理方法。如果每个NAT路由器后面都有一台服务器,则可以将其中继指令发送到每个端点。您的中央管理服务器可以控制少量本地管理服务器,每个NAT防火墙后面一个,并且每个服务器都可以直接访问同一LAN中的端点。