【发布时间】:2015-09-11 16:07:15
【问题描述】:
我们想要构建一个简单的数据共享应用程序,其中 2 台 Android 手机(或计算机)连接到任何互联网(wifi/网络)上,通过 HTTPS 将其数据上传和下载到服务器。
例如A 想向 B 发送数据,A 会触发类似 HTTPS API 的“put”,并将数据上传到 B 的 bucket。B 会调用类似 HTTPS API 的“get”并下载其内容。
现在的问题是 A 和 B 之间的通信是基于需求的。它可能在几分钟、几小时或几天后发生。如果我们使用 HTTPS 方式,那么我们将不得不让 B 长时间轮询服务器,这会在没有消息的情况下耗尽资源数天。如果我们每 1 分钟或 2 分钟轮询一次,那么通信将不会近乎实时地发生。
为了解决这个问题,我们提出了以下想法:
- 每当手机注册到互联网时,它都会创建一个 UDP 端口并 绑定到它
- 它与服务器建立 1 次 HTTPS 连接并发送其 IP 地址和端口
- 服务器和客户端之间可以有可选的虚拟数据交换 使用 UDP(往返)
- 在此客户端没有任何活动连接并保持
在同一个互联网上;它在 UDP 上持续等待
接收数据的端口;如果互联网再次发生变化 从第 1 步开始重复 - 当接收到给定客户端的数据时,服务器发送 一些预定义的虚拟 UDP 数据作为唤醒呼叫发送给客户端。这 数据持续发送,直到通过 HTTPS 读取客户端存储桶
- 识别在 UDP 上接收到的数据后,客户端会进行 HTTPS 连接到服务器并从其存储桶中读取其预期数据,并 关闭;服务器识别到这一点并停止 UDP
理论上这个解决方案看起来不错。但是从互联网上我遇到了以下问题,我需要回答:
- 应该从什么样的IP地址和端口发送到服务器 客户?是 ISP/网络提供的 IP 还是其他什么?
- 服务器如何识别确切的客户端来发送一些 UDP 数据? 例如如果同一互联网上的 2 部手机具有相同的 IP 和端口
- 在C socket库中,UDP连接有2种方式:(1)
connect()然后send()/recv()(2) 直接sendto()/recvfrom()使用 IP 地址。应该用在哪个 这种情况?
除上述问题外,欢迎对上述“推送通知”的实际方式进行任何改进。
【问题讨论】:
-
由于客户端可能没有公共 IP,恐怕您不能使用这种解决方案。
-
@Qiau,这是否意味着服务器到客户端的 UDP 数据是不可能的?在这种情况下(从服务器到客户端),流媒体/VoIP 应用程序如何工作?
标签: android networking https push-notification udp