如何在不打开端口监听的情况下提供数据?

How to serve data without open a port to listen?

我开发了一个应用程序,主要用于处理来自大型数据库的数据。客户端是从客户 PC 提取数据的移动应用程序,其中此服务器应用程序是 运行.

主要问题是服务器应用程序必须安装在客户 PC 上。有数百个客户,因此他们需要能够设置服务器应用程序。

我的第一次尝试是开发一个普通的服务器应用程序。当这个应用程序启动时,它会打开一个端口并监听它。手机应用只需要连接用户IP就可以获取数据。它工作正常,但这种尝试不是一个好的解决方案。首先是因为每个用户都需要配置路由器、代理等,而且在很多情况下,他们并不具备计算机知识。其次,另一位开发人员告诉我,在 2015 年,任何人都不应该在客户 PC 上安装开放端口的应用程序,因为这真的很危险。 (我不知道)。

我想要的是:

1) 避免配置代理、路由器等。客户安装必须非常简单。

2) 移动应用程序需要向客户PC 请求数据。在移动设备发送请求之前,什么时候需要什么是未知的。

有人建议使用投票系统,但我不清楚它是如何工作的。客户应用程序需要每隔几秒向主服务器请求一次“实时”,这似乎不可行。

还有人建议定期向主服务器推送数据,然后手机可以向主服务器请求这些数据。我无法将数据从客户推送到我们的主服务器我不知道移动应用程序需要什么

我的场景可以遵循哪种模式?

谢谢

这样的场景可能是面向消息的中间件的用例,可能使用像 CloudAMQP 这样的服务,它可以通过多种编程语言的应用程序访问。

然后移动设备可以向 CloudAMQP 服务器发送请求,该请求将由用户/客户服务器接收。从 CloudAMQP 消息代理的角度来看,两者都是客户端。客户服务器将请求的数据传送到 CloudAMQP 服务器,然后再设置到移动设备。

对于这种通过面向消息的中间件的 request/response 通信方式,有可用的标准解决方案,例如临时队列:移动设备连接并在 AMQP 服务器上创建目标队列,该队列仅存在于连接的持续时间。然后每个请求都可以使用临时队列作为客户服务器的回复地址。客户服务器接收请求,生成响应,并将其发送到给定的回复地址。 RabbitMQ 的示例(CloudAMQP 背后的消息代理)可在 RabbitMQ 主页上找到:

Remote procedure call (RPC) (using the Java client, also available in C# 和其他语言)

我已将示例代码移植到 Habari Client for RabbitMQ 库(我是其作者)的 Delphi 演示。

请注意,CloudAMQP 只是托管消息代理的一种选择。当然,您可以在自己的系统中托管消息代理(RabbitMQ、ActiveMQ、Apollo...)。这些免费的开源消息代理已准备就绪,您的客户无需为传入连接打开端口。