基于HTTP的长轮询简单实现
程序员文章站
2023-08-26 18:06:55
Web客户端与服务器之间基于Ajax(http)的常用通信方式,分为短连接与长轮询。 短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。 在长轮询机制中,客户端像传统轮询一样从服务器请求数据。然而,如果服务器没有可以立即返回给客户端的数据,则不会立刻返回一个空结果, ......
web客户端与服务器之间基于ajax(http)的常用通信方式,分为短连接与长轮询。
短连接:客户端和服务器每进行一次http操作,就建立一次连接,任务结束就中断连接。
在长轮询机制中,客户端像传统轮询一样从服务器请求数据。然而,如果服务器没有可以立即返回给客户端的数据,则不会立刻返回一个空结果,
而是保持这个请求等待数据到来(或者恰当的超时:小于ajax的超时时间),之后将数据作为结果返回给客户端。
长轮询机制如下图所示:
web客户端代码如下:
//向后台长轮询消息 function longpolling(){ $.ajax({ async : true,//异步 url : 'longpollingaction!getmessages.action', type : 'post', datatype : 'json', data :{}, timeout : 30000,//超时时间设定30秒 error : function(xhr, textstatus, thrownerror) { longpolling();//发生异常错误后再次发起请求 }, success : function(response) { message = response.data.message; if(message!="timeout"){ broadcast();//收到消息后发布消息 } longpolling(); } }); }
web服务器端代码如下:
public class longpollingaction extends baseaction { private static final long serialversionuid = 1l; private longpollingservice longpollingservice; private static final long timeout = 20000;// 超时时间设置为20秒 public string getmessages() { long requesttime = system.currenttimemillis(); result.clear(); try { string msg = null; while ((system.currenttimemillis() - requesttime) < timeout) { msg = longpollingservice.getmessages(); if (msg != null) { break; // 跳出循环,返回数据 } else { thread.sleep(1000);// 休眠1秒 } } if (msg == null) { result.adddata("message", "timeout");// 超时 } else { result.adddata("message", msg); } } catch (exception e) { e.printstacktrace(); } return success; } public longpollingservice getlongpollingservice() { return longpollingservice; } public void setlongpollingservice(longpollingservice longpollingservice) { this.longpollingservice = longpollingservice; } }
上一篇: 一个文物贩子,致使大量中国国宝流失海外