如何从服务器向路由器后面的设备发出请求

时间:2016-04-07 18:53:20

标签: websocket server

我需要从服务器向在用户家中的硬件上运行的应用程序发出请求。我不能让应用程序将数据推送到服务器,因为我不存储数据,但需要将其转发到面向客户端的Web应用程序(我也不允许将数据存储在服务器上)。我目前不确定如何实现这一目标。我唯一的想法是打开空闲的套接字连接,我可以将请求写入。这看起来很复杂,我不知道它是否可扩展(开放套接字连接是否有限制?闲置连接浪费了多少资源?)。它也有点低级,但我看不出我如何使用http,我不知道其他合适的协议。

1 个答案:

答案 0 :(得分:1)

以下是一些可用选项。我假设家庭网络是一个典型的家庭安装,默认情况下来自互联网的传入连接被家庭路由器/防火墙阻止。

主页应用程序投票服务器

由于家庭网络上运行的应用程序可以连接到互联网,因此您可以关闭连接,以便家庭网络上的应用程序连接到互联网上的服务器。根据应用程序和需求,主应用程序可以与服务器建立简单的HTTP连接,每天一次,每小时一次,每5分钟一次等等......具体取决于具体情况。如果服务器对于主应用程序没有任何内容,那么它只返回一个没有数据的简单响应。如果服务器有一些家庭应用程序的数据,那么它只是在传入请求进入时返回该数据。

此方案的主要缺点是服务器必须等到下一个客户端轮询间隔才能将数据传送到客户端。

Home Application连接webSocket或socket.io连接服务器

同样,home应用程序连接到服务器,但这次它创建了一个webSocket或socket.io连接。只要你愿意,那个连接就可以保持打开状态。打开此连接后,服务器可以随时发送客户端数据。如果连接随时中断,则客户端只需重新建立新连接。这在客户端几乎没有任何成本,服务器上的资源非常少(每个连接有一点内存)。

正确配置的服务器可以处理数十万个同步的webSocket连接。特别配置的服务器甚至可以处理数百万个连接。

在家庭路由器/防火墙中打开孔

在这种情况下,家庭路由器/防火墙被配置为将特定端口(可能不是端口80)上的传入请求“端口转发”到主应用程序。在这种情况下,家庭应用程序必须先在服务器上注册其IP地址,并正确配置家庭路由器/防火墙,以允许直接访问家庭应用程序的特定端口。一旦正确配置,服务器就可以直接连接到主应用程序。

由于常规消费者最终用户通常无法配置路由器/防火墙以允许此访问并且难以进行故障排除,因此这不是一个非常常用的选项。

混合轮询

还有一种混合方法,家庭客户端定期向服务器发送UDP数据包。此UDP数据包使家庭路由器/防火墙打开从同一服务器返回到主客户端的返回路径。该返回路径将保持打开一段时间,并且在该时间间隔内,服务器可以向客户端发送UDP数据包,路由器/防火墙将允许它进入。这是某些对等方使用的方案的推导。对等协议,以通过家庭路由器/防火墙。因为这是UDP,而不是TCP,客户端/服务器负责自己的交付可靠性。