新闻资讯

全国统一免费咨询电话
400-123-4567
传真:+86-123-4567
手机:138-0000-0000
Q Q:1234567890
E_mail:admin@youweb.com
地址:广东省广州市天河区88号
AJAX长轮询怎么用?带你看懂消息推送的原理和代码示例
于现代网页应用里头,实时获取服务器讯息,有着多样的技术可作选择,当中长轮询凭借其具备简单高效性质这点,于特定情景状况线下,依旧占有一定的位置。
长轮询的基本原理
长轮询是这样一种技术,它让客户端与服务器维持连接,一直到服务器有新的数据才予以响应。当客户端发起请求之后,服务器并不会马上进行回复。该连接会持续存在,直至服务器有数据能够推送,或者达到了预先设置的超时时间。一旦服务器发送数据并且断开连接,客户端在处理完数据之后,会即刻发起一个新的请求,就这样循环不止,达成了类似“实时”推送的成效。整个进程模拟出了服务器向客户端的持续信息流 。
这种机制跟流技术存在本质不同,在典型的服务器推送流连接里面,服务器能够在一个持久的 TCP 连接之上,持续不间断地给客户端发送多个数据包。然而长轮询之时,在一次连接之中,服务器仅仅推送一回数据,随后必定要断开连接。客户端要为获取下一回更新而再度建立连接。这个“请求 - 响应 - 断开 - 再请求”的循环,是它的核心特性。
jQuery 1.5 with long poll
AJAX长轮询的实现
AJAX长轮询是一种很常见的实现方式,客户端借助XMLHttpRequest对象向服务器发起请求,还会设置一个时间较长的超时时间,服务器端程序会将此请求挂起,于数据准备好的时候返回响应,响应内容能够是纯文本,或者是格式化后的JSON,又或者是XML数据,这为客户端的数据处理给予了灵活性。
/**
* 简单模拟每秒输出一次当前系统时间,精细到毫秒
*
* @author yongboy
* @date 2011-2-11
* @version 1.0
*/
@WebServlet("/getNextTime")
public class GetNextTimeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.print(DateFormatUtils.format(System.currentTimeMillis(),
"yyyy-MM-dd HH:mm:ss SSS"));
out.flush();
out.close();
}
}
从形式方面来看,它跟普通的AJAX GET请求相像,然而其同步性更为突出。客户端一定要等待前一个长轮询请求回来了且处理完了之后,才能够发起下一个请求。这样一种顺序执行的方式把并发连接有可能引发的混乱给避免掉了,还让客户端的逻辑简化了。在开发期间需要留意处理好请求队列,借以免于连接没办法持续不停地开展。
基于jQuery的客户端示例
运用jQuery等库能够使长轮询的客户端代码得以简化,开发者能够去定义一个函数,此函数内里发起AJAX请求,而且在请求成功之后的回调函数当中,再次去调用自身,与此同时就形成了一个递归循环,达成了长轮询的不间断运行,代码结构明晰,便于维护。
jQuery 1.5 with JSONP FOR Comet
在服务器端进行实现,能够做到较为简单,比如说,存在一个脚本,它每隔10秒就会对数据源展开一次检查。要是没有新的数据出现,该脚本就会进入休眠状态,以此等待;一旦出现新数据,便会马上把它包装成JSON格式,然后输出,随即将本次请求予以结束。像这样的一种组合,能够让实时数据更新功能迅速地嵌入到现有的网页当中。
/**
* JSONP形式简单模拟每秒输出一次当前系统时间,精细到毫秒
* @author yongboy
* @date 2011-2-11
* @version 1.0
*/
@WebServlet("/getNextTime2")
public class GetNextTimeServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
String callback = request.getParameter("callback");
if(StringUtils.isBlank(callback)){
callback = "showResult";
}
PrintWriter out = response.getWriter();
StringBuilder resultBuilder = new StringBuilder();
resultBuilder
.append(callback)
.append("('")
.append(DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss SSS"))
.append("');");
out.print(resultBuilder);
out.flush();
out.close();
}
}
JSONP与长轮询结合
有着一种名为JSONP的解决方案,是当面临需要进行跨域获取数据的情况时,所呈现出来的,它的原理是借助(或利用)`。