服务端推送技术方案-让你的消息更及时
背景:在上一篇文章中介绍了扫码登录的原理,其中涉及到了服务端和客户端的通信,客户端如何能获取最新的状态?服务端又怎样把最新的消息推送给客户端?本文将围绕服务端和客户端的通信展开叙述。
以HTTP为基础的请求中,服务端“推送”方案有三种,这里其实的推送并不是严格意义上的推送,这里是以获取服务端最新及时的消息为重点,只有第三种方案是服务端推送。
1 基于轮询
2 长训轮(long-polling)
3 长链接
接下来分别讲述下这三种方案的优缺点和使用场景。
1 基于轮询
优点:开发简单,客户端实现即可,不需要服务端配合。
缺点:大多数情况下是无用的请求,占用服务端资源。
实现方式:客户端每隔一段时间调用接口,无论有没有数据,接口立即返回.
使用场景:不想折腾的开发者,消息及时性要求没那么高,服务器资源资源足。
$(function() {get();setInterval("getMsg();",5000);
});function getMsg(){$.ajax({url : "${APP_PATH}/getMsg",data : {},datatype: "json",type : "post", success : function(result) { //console.log(result);},error:function (){ } });
2 基于长轮询(long-polling)
优点:消息及时,命中率高,消耗服务端资源少
缺点:服务端和客户端需要同时改造,消息会有部分延迟(发生在请求交替之时)
实现方式:客户端在上次请求返回后,在发送下次请求,服务端当有数据或者超时后返回,没有数据时hang住链接(超时时间需要综合考虑服务器性能和及时性做出平衡,有代理的话需要考虑代理对于链接的超时机制)。
使用场景:扫码登录,微信网页端获取消息等。
客户端代码:
后端websocket代码:
备注:链接需要维护连接池,对于java有两种方式:1 使用tomcat容器支持实现 2 spring 4.x实现websocket,前端需要socketjs
ublic class WsServer extends WebSocketServer {public WsServer(int port) {super(new InetSocketAddress(port));}public WsServer(InetSocketAddress address) {super(address);}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {// ws连接的时候触发的代码,onOpen中我们不做任何操作}@Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {//断开连接时候触发代码userLeave(conn);System.out.println(reason);}@Overridepublic void onMessage(WebSocket conn, String message) {System.out.println(message);if(null != message &&message.startsWith("online")){String userName=message.replaceFirst("online", message);//用户名userJoin(conn,userName);//用户加入}else if(null != message && message.startsWith("offline")){userLeave(conn);}}@Overridepublic void onError(WebSocket conn, Exception ex) {//错误时候触发的代码System.out.println("on error");ex.printStackTrace();}/*** 去除掉失效的websocket链接* @param conn*/private void userLeave(WebSocket conn){WsPool.removeUser(conn);}/*** 将websocket加入用户池* @param conn* @param userName*/private void userJoin(WebSocket conn,String userName){WsPool.addUser(userName, conn);}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
