在没有客户端请求的情况下将数据从服务器推送到客户端?


11

我在浏览Stack Exchange时注意到有动态通知,例如“ 3条新消息,单击以显示”。我要对这种动态更新进行说明。

假设我要创建一个包含10条近期新闻的轮播/幻灯片。我希望这个轮播在队列中每小时更新一次。较新的文章会将较旧的文章排除在队列之外。解决方案就在我的头上。

  1. 用户登录到客户端。
  2. 客户端计算直到下一个小时标记的分钟数,并将计时器设置为在该小时执行。
  3. 在小时标记处,向服务器发送有关尚未出现在轮播中的任何新闻文章的请求。
  4. 处理响应。
  5. 重置计时器。

这是可以接受的策略吗?我可以不依赖客户请求来实现此目标吗?换句话说,Stack Exchange如何实现其动态更新?


4
看看SignalR。
罗伯特·哈维

我建议您阅读RSSAJAX以获得想法。RSS是用于订阅源的标准协议的示例,而AJAX是用于在不重新加载页面的情况下更新客户端(浏览器)的高级概念。我敢打赌,这就是Stack Exchange的工作方式。


客户端是浏览器,自定义客户端还是其他?
outis

这有点用户敌视,但是您可以让HTML页面每隔15分钟左右刷新一次。大多数新闻网页都这样做。
吉尔伯特·勒布朗

Answers:


7

为了推送数据,您必须标识一个客户端,这可以通过将客户端订阅到服务器来完成。完成后,您将获得具有持久连接的已订阅客户端列表。

根据您要实现的目标,我想说的是客户端最好向服务器请求,这样您就不必维护持久的连接并使用请求/响应通信协议作为HTTP。

保持持久连接的一个例子是实时聊天/即时消息传递系统,因为通信应该实时进行。

请记住,持久连接通常是通过使用来实现的sockets,它在实现您自己的通信协议,加密等过程中添加了一个覆盖层。


2

基本上,您需要将数据推送到客户端,并且由于双向通信不在http协议的范围内,因此很难自行实现。

您的问题的解决方案是socket.io

如其网站所述,

“ Socket.IO支持基于事件的实时双向通信。它可在每个平台,浏览器或设备上工作,并同时关注可靠性和速度。”

希望这能解决您的问题。


7
如果您声明是否以及如何与socket.io关联,以及它将如何根据您对框架的知识/经验(与网站的单纯“使命陈述”相反),将如何帮助解决提问者问题,这将是有帮助的
本尼2015年

WebSockets绝对比Socket.IO更可取,因为所有主流浏览器都实现了该标准。大多数主要语言都有websocket实现,但没有socket.io实现。Socket.io在消息中添加了其他结构,因此也不容易兼容。
亚历克斯·雷肯

1

我不能说SE是如何做到的,尽管由于它是一个网站,所以有几种方法可以使用它们,这些方法可以包括cron作业集,以便在小时内运行php / asp / what-have-you脚本来推送数据。但是,如果您正在寻找仅基于Web的解决方案,那就是这样。

但是由于您提到的是客户端,因此您可以创建一个文件,其中包含该客户端的最新新闻更新的日期/时间,并让客户端检查存储在该文件中的值,并将其与用户的系统时间进行比较,以查看是否有一个小时自上次更新以来已过去。如果已经至少一个小时,那么客户端将从您的服务器请求最新的新闻流,然后服务器将最新的新闻流返回给客户端。

我会避免使用计时器或至少仅使用计时器,因为只有在用户保持客户端打开状态以保持计时器运行的情况下,该方法才有效。但是,如果您也有我建议的文件,则可以创建一个子例程来打开文件,将时间存储到变量中,并将其与系统时间进行比较,如果至少一个小时,则发出请求。然后,您只需要针对某些事件对sub进行调用。我肯定会在表单加载时调用它,因为如果用户只是重新启动其客户端,那么您将需要最新消息。如果距离他们在客户上已经过了几天,那么它将显示出古老的新闻。尽量减少该子项与客户端的负载,并按照您的建议启动计时器。

如果我误解了您的意图,我深表歉意,因为我不确定您的意图。但是希望无论哪种方式都可以为您带来一些有价值的东西!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.