新闻资讯

全国统一免费咨询电话

400-123-4567

传真:+86-123-4567

手机:138-0000-0000

Q Q:1234567890

E_mail:admin@youweb.com

地址:广东省广州市天河区88号

您当前的位置是: 首页 > 新闻资讯

新闻资讯

AJAX长轮询怎么用?带你看懂消息推送的原理和代码示例

发布时间:2025-12-06 03:41:09 丨 文章作者:小编 丨 浏览次数:180

于现代网页应用里头,实时获取服务器讯息,有着多样的技术可作选择,当中长轮询凭借其具备简单高效性质这点,于特定情景状况线下,依旧占有一定的位置。

长轮询的基本原理

长轮询是这样一种技术,它让客户端与服务器维持连接,一直到服务器有新的数据才予以响应。当客户端发起请求之后,服务器并不会马上进行回复。该连接会持续存在,直至服务器有数据能够推送,或者达到了预先设置的超时时间。一旦服务器发送数据并且断开连接,客户端在处理完数据之后,会即刻发起一个新的请求,就这样循环不止,达成了类似“实时”推送的成效。整个进程模拟出了服务器向客户端的持续信息流 。

这种机制跟流技术存在本质不同,在典型的服务器推送流连接里面,服务器能够在一个持久的 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的解决方案,是当面临需要进行跨域获取数据的情况时,所呈现出来的,它的原理是借助(或利用)`。



loading ...



Copyright © 2002-2024 米兰milan官网 版权所有 非商用版本

电 话:400-123-4567 手 机:138-0000-0000 传 真:+86-123-4567 E-mail:admin@youweb.com

地 址:广东省广州市天河区88号

粤IP**********

扫一扫关注微信公众帐号