所以我创建了一个应用程序,应用程序连接到服务器并告诉它做某事。然而,服务器需要花费大量时间来做这件事(比如一个小时左右)。因此,将客户端连接到服务器这么长时间没有意义。我希望服务器必须创建与客户端的连接,以通知他已准备好交付最终结果。然后在连接后,他将数据发送给客户端。
我在想这里有两个想法:
我也可以在客户端创建服务器,客户端可以监听服务器连接。然而,我的客户通常是一些桌面应用程序或资源有限的移动应用程序,其中一些也在防火墙/ NAT后面。因此,即使他们有服务器运行,我也不确定我的主服务器是否能够连接到它们。
客户可以定期检查结果是否准备好。这样客户端就不必维护任何服务器或任何东西。它将是普通的旧客户端服务器架构。但这会花费我很多不必要的流量,因为结果可能在几分钟到几小时内可用。客户经常对服务器进行操作对我来说似乎不太好。
我首先不知道从哪里开始或谷歌这个东西。 我知道这样的事情存在,因为我总是看到服务器如" Skype"通知我的桌面应用我有新朋友请求或gmail通知系统,当收到新邮件时,Google会在桌面上显示一条消息。
大多数Google搜索都会产生与客户端连接到服务器相同的内容。但情况恰恰相反。
如果这个问题不符合标准,一些参考文献也会很棒,我会删除这篇文章。我很有可能只是没有想到什么和愚蠢的事情。请帮忙。感谢。
答案 0 :(得分:2)
所以在我研究了很多相关文章后,我就提出了这个问题。
这些链接描述了所谓的“服务器推送”,它基本上将数据从服务器推送到客户端。这里讨论了各种方法。我的观点#2实际上非常接近解决方案,而#2点的术语称为长轮询。
但是,这两篇文章中讨论的方法都是将数据推回到Web浏览器。在某些情况下,解决方案可以扩展到移动客户端中的服务器推送,但我仍在阅读它们,因此无法评论太多。
然而,对于服务器到应用程序推送,这是我的要求,有两件事真的起来了:
我目前决定使用Amazon SNS,并且还会继续学习Redis,以备将来使用。
需要服务器推送?忘掉其他一切,使用Redis + Socket-IO + Node-JS。我怎么不知道Websockets。它是下一个最好的东西。
在我的应用程序中,我只是向Redis发送任何消息,我希望将其推送给客户。 Redis发布这些消息。 Socket.IO正在使用psubscribe
监听频道而不是一个频道。用户类别由频道名称定义。
一旦socket.io(用node.js编写)听到消息,它只是emit
到客户端的那些消息。客户端正在侦听特定端口上的socket.io. Socket.io支持rooms
,例如redis中的channel
。
对于实时示例,只需google real time chat with socket.io and node.js
。
如果有人要求我,我也会写一些例子。真的很容易。
答案 1 :(得分:1)
在大多数情况下,就像你说的那样:
- 客户可以定期检查结果是否准备好。这样客户端就不必维护任何 服务器或任何东西它将是普通的旧客户端服务器 建筑。
醇>
因为易于实施。
你可以尝试的另一件事是UDP-hole-punshing。我想,它不是很多代码,但也需要一个保持活动的信号。然后服务器可以发送到客户端。
第三个想法来自pwnat。它适用于IP。客户端将预定义的数据包发送到不会到达的地址。这允许互联网上的任何人在已知精确数据包时回答。发送和接收数据包以及回复都需要IP级访问,这通常需要更高的权限。
此外,您可以使用UPNP配置客户端防火墙以通过某些数据包。