最近,我遇到了这种需求。客户端(Web浏览器)请求在服务器端异步完成任务,然后客户端离开。
当服务器完成任务时,它将通过发送一些消息来通知客户端。
所以我的问题是:
是否有办法从服务器端主动向客户端发送消息(纯文本,JSON等)?
最近,我遇到了这种需求。客户端(Web浏览器)请求在服务器端异步完成任务,然后客户端离开。
当服务器完成任务时,它将通过发送一些消息来通知客户端。
所以我的问题是:
是否有办法从服务器端主动向客户端发送消息(纯文本,JSON等)?
我能够想到两种可能的解决方案:
第一种,最常见(也是最安全)的解决方法可能是AJAX长轮询,即在客户端设置一个ajax查询来定期请求并处理响应。例如,设置一个资源,在服务器端处理完成时返回您的“已完成”消息。鉴于您的问题,这并不理想,但肯定是可行的且非常可靠。
要实际使用推送技术(这正是您所问的,但不一定是您真正需要的),您应该查看WebSockets。如果您查看该链接,您将在文章正文中看到支持该技术的浏览器列表,并根据您的用例选择是否需要进一步调查。
我个人处理了很多旧浏览器,因此ajax轮询将成为我的首选。假设这是一个半长时间运行的过程,每2-5秒轮询一次不会让用户感到不适。这对于实时聊天或任何其他东西都不好,但对于“我解析了您的200M Excel文件”应该没问题。
解决这个问题有三种常用的技术:
XMLHttpRequest - 使用 XMLHttpRequest
对象从客户端(Web 浏览器)定期向 Web 服务器发出请求,以查看新信息是否可用。这种技术通常称为轮询。轮询的缺点是服务器只能在客户端请求时才能传输消息。
Server-sent events - 使用 EventSource
对象创建一个回调函数,当 Web 服务器发送新消息时执行该函数。这种技术通常称为服务器推送。服务器推送的缺点是 Internet Explorer 和 Edge 目前不支持它,并且 Web 服务器无法知道客户端是否停止监听,直到服务端尝试发送消息。
WebSockets - 使用 WebSocket
对象创建一个双向通信通道,以便服务器可以随时向客户端发送消息,反之亦然。此技术使用的网络资源比前两种方法更多,在聊天程序中更常用,因为需要立即发送双向消息。