详解如何实现在线聊天系统中的实时消息获取

本文详细介绍了如何实现在线聊天系统的实时消息获取,包括Ajax轮询、Ajax长轮询和Server-Send Event技术。重点讲解了Server-Send Event的工作原理和实现代码,以及如何通过华为API Gateway创建API服务。最后,提供了兼容各浏览器的网页示例,实现了每秒刷新的时间展示。
摘要由CSDN通过智能技术生成

序言

传统web浏览器应用采用客户端主动请求方式,只有在收到浏览器请求时服务端才返回消息,这种模式已经不能满足日益多样化的web应用需求,例如:

在线聊天系统:需要实时获取聊天消息。

实时监控系统:需要实时获取监控对象状态。如仪表读数、告警信息等。

随着html技术演进,发展出了多种服务器推送技术,用于服务器向浏览器客户端推送消息。

 

Ajax轮询

采用Ajax定时向服务端发送请求检查有无消息更新。网页定时向服务器发送请求,若服务器有消息推送,则返回消息,否则返回空消息,如下图所示:

这种轮询方式需要发送大量无效请求,大大消耗了服务器资源,且推送消息的实时性较低。

 

Ajax长轮询

Ajax长轮询对前面的Ajax轮询方式做了改进,服务端收到请求后,不再立即返回,而是等待有消息推送时返回。网页收到服务端返回的消息后,立即发起一个新的请求,等待下一个推送消息。

采用这种方式的服务端实现比前者复杂,需要维护一个客户端建立的连接列表,当产生对某个客户端的推送消息后找到对应的连接并发送。优势是减少了轮询消耗,发送事件的实时性得到增强。

 

Server-Send Event

Server-Send Event是html5标准新增的技术,它延用了Ajax长轮询的思路,并对其进行了一些规范。Server-Send Event让服务端可以向客户端流式发送文本消息,并在发送完一个消息后保持请求不结束,连接始终保持。如下图所示:

 

网页调用EventSource接口向服务器发送请求:

var source = new EventSource('http://localhost:8080');    

source.addEventListener('message', function(e) { console.log(e.data); }, false);

 

服务器返回的Content-Type头必须为text/event-stream,且返回完一个消息后不关闭请求,后续消息仍然使用同一个请求返回。浏览器会自动以换行符识别每个消息。

 

响应头

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值