在web项目中,服务器向web页面推送消息是一种常见的业务需求,PC端的推送技术可使用socket创建一个长连接实现。web
传统的web服务器都是客户端发送请求,服务器端给出响应。如今更直接的要求是特定的时间内没有客户端发送请求的状况下服务器主动推送消息到客户端。浏览器
常见的主要手段之后一下几种:服务器
【轮询】 :Ajax 隔一段时间向服务器发送请求,询问数据是否发生改变,从而进行增量式的更新。轮询的时间间隔成了一个问题:时间过短,会有大量的请求发送到服务器,会对服务器负载形成影响;间隔太长业务数据的实时性得不到保障。使用轮询的优势实现逻辑简单,缺点是无效请求的数量多,在用户量较大的状况下,服务器负载较高。所以轮询的方式一般在并发数量较少,而且对消息实时性要求不高的状况下使用。网络
【长轮询技术】: 客户端性服务器发送Ajax请求,服务器接到请求后“握“住链接,直到有新消息或超时(设置)才返回响应信息并关闭链接,客户端处理完响应信息后再向服务器发送新的请求。长轮询技术有点实时性高,无消息的状况下不会进行频繁的请求;缺点是服务端维护和客户端的链接会消耗掉一部分资源。并发
【插件提供socket方式】: 好比利用Flash XMLSocket,Java Applet套接字,Active包装的socket。优势是对原生的socket支持,和PC端,移动端方式类似;缺点是浏览器须要安装对应的插件。框架
【WebSocket】: 是HTML5开始提供给的一种浏览器与服务器间进行全双工通信的网络技术。优势是更好的节省服务资源和带宽并达到实时通信;缺点是目前还未普及,浏览器支持很差socket
考虑到浏览器兼容性和性能问题,采用长轮询是一种比较好的方式。netty-socketio 是一个开源的Socket.io 服务器端的一个Java的实现,他基于Netty框架。性能