如何在web应用程序中从服务器向客户端发送消息

8

最近,我遇到了这种需求。客户端(Web浏览器)请求在服务器端异步完成任务,然后客户端离开。

当服务器完成任务时,它将通过发送一些消息来通知客户端。

所以我的问题是:

是否有办法从服务器端主动向客户端发送消息(纯文本,JSON等)?


1
你想做什么?提供一些场景会更有帮助。你使用了哪些服务器和客户端工具?例如:PHP(服务器)和Javascript(客户端)。或者是其他的东西(例如Java,C等)。简短回答:是的,这是可能的。更详细的答案需要一些额外的信息 :)。 - ale
2个回答

9

我能够想到两种可能的解决方案:

第一种,最常见(也是最安全)的解决方法可能是AJAX长轮询,即在客户端设置一个ajax查询来定期请求并处理响应。例如,设置一个资源,在服务器端处理完成时返回您的“已完成”消息。鉴于您的问题,这并不理想,但肯定是可行的且非常可靠。

要实际使用推送技术(这正是您所问的,但不一定是您真正需要的),您应该查看WebSockets。如果您查看该链接,您将在文章正文中看到支持该技术的浏览器列表,并根据您的用例选择是否需要进一步调查。

我个人处理了很多旧浏览器,因此ajax轮询将成为我的首选。假设这是一个半长时间运行的过程,每2-5秒轮询一次不会让用户感到不适。这对于实时聊天或任何其他东西都不好,但对于“我解析了您的200M Excel文件”应该没问题。


1
只是为了澄清,如果你的例子意味着用户实际上离开正在轮询的页面(即关闭浏览器,转到另一个站点等),我想不出任何方法来保持该连接。如果这是你的例子,可能应该考虑另一种通知系统。(可能是电子邮件) - jholder

5

解决这个问题有三种常用的技术:

  1. XMLHttpRequest - 使用 XMLHttpRequest 对象从客户端(Web 浏览器)定期向 Web 服务器发出请求,以查看新信息是否可用。这种技术通常称为轮询。轮询的缺点是服务器只能在客户端请求时才能传输消息。

  2. Server-sent events - 使用 EventSource 对象创建一个回调函数,当 Web 服务器发送新消息时执行该函数。这种技术通常称为服务器推送。服务器推送的缺点是 Internet Explorer 和 Edge 目前不支持它,并且 Web 服务器无法知道客户端是否停止监听,直到服务端尝试发送消息。

  3. WebSockets - 使用 WebSocket 对象创建一个双向通信通道,以便服务器可以随时向客户端发送消息,反之亦然。此技术使用的网络资源比前两种方法更多,在聊天程序中更常用,因为需要立即发送双向消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接