龙源期刊网 http://www.qikan.com.cn
使用Websocket和Servlet实现服务器定点推送
作者:钱宇虹
来源:《软件工程》2016年第10期
摘 要:针对Java Web实时系统中的消息推送这一关键问题,本文基于Tomcat8和WebSocket标准,提出并且实现了一个服务端定点推送模型,能够向指定的Web注册用户进行消息推送。该模型具有非广播的特点,即在没有浏览器请求的情况下通过Servlet主动将消息推送至某个已注册的Web用户。该模型已经成功地应用于呼叫中心系统中将电话分机状态和弹屏信息推送给Web坐席,该模型也可以用于即时消息、游戏应用、实时证券报价、股票系统等Web实时系统,具有广泛的使用价值。 关键词:Tomcat8;WebSocket;定点推送 中图分类号:TP311 文献标识码:A 1 引言(Introduction)
众所周知,HTTP协议是基于请求-响应模式的无状态的单向协议,即每次都要由客户端(如浏览器)主动向服务端发出“请求”,服务端做出处理后将结果作为“响应”返回给客户端。“无状态”指的是每次的请求-响应都必须经历建立连接和释放连接的过程,前一次连接和后一次连接相互之间没有关系。“单向”指的是客户端是主动方,服务端是被动方,服务端不能主动向客户端发送数据。HTTP协议的这一特点对传统的Web应用,像电子商务网站、搜索引擎等等非常合适,但是不能满足日益增强的实时性需求的Web应用,这些应用要求在无需客户端发出请求的前提下,服务端能实时地将信息主动推送到客户端,如基于Web的聊天系统、即时消息、游戏应用、实时证券报价和股票系统等。
过去,针对实时性较强的应用,开发人员使用轮询和Comet技术这些折中方案。轮询就是客户端按照预先设置的时间间隔向服务端发送请求,周期性地查询是否有数据更新。早期的轮询是通过在HTML头部插入META元信息来实现网页的自动刷新,后来人们使用AJAX轮询。AJAX轮询带来的最大好处就是在不刷新整个页面的前提下可以实现网页的局部更新,既提高了做事的效率又增强了用户体验,但是AJAX还是受限于请求-响应模式,由于无法预期什么时候推送消息,造成很多无效的请求。而Comet是使用一种新的技术去做轮询得到的效果,这种技术虽然可以实现双向通信,但是依然需要发出请求,而且Comet普遍采用长连接,这会导致大量消耗服务器带宽和资源。Comet技术本质上还是没有摆脱HTTP请求-响应模式,不能算是真正意义上的双向通信,并且开发复杂度也较高。