服务端推送技术方案-让你的消息更及时

背景:在上一篇文章中介绍了扫码登录的原理,其中涉及到了服务端和客户端的通信,客户端如何能获取最新的状态?服务端又怎样把最新的消息推送给客户端?本文将围绕服务端和客户端的通信展开叙述。

以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);}}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部