基于HTTP的长轮询实现

article/2025/9/9 15:04:55

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

一、什么是长连接、长轮询?

用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息。这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已。

二、长连接、长轮询的应用场景

长连接、长轮询一般应用与WebIM、ChatRoom和一些需要及时交互的网站应用中。其真实案例有:WebQQ、Hi网页版、Facebook
IM等。 如果你对服务器端的反向Ajax感兴趣,可以参考这篇文章 DWR 反向Ajax
服务器端推的方式:http://www.cnblogs.com/hoojo/category/276235.html

三、优缺点

  • 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
    优点:后端程序编写比较容易。
    缺点:请求中有大半是无用,浪费带宽和服务器资源。
    实例:适于小型应用。

  • 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
    优点:在无消息的情况下不会频繁的请求,耗费资源小。
    缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
    实例:WebQQ、Hi网页版、Facebook IM。

  • 长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
    优点:消息即时到达,不发无用请求;管理起来也相对方便。
    缺点:服务器维护一个长连接会增加开销。
    实例:Gmail聊天

  • Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
    优点:实现真正的即时通信,而不是伪即时。
    缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
    实例:网络互动游戏。

四、实现原理

所谓长连接,就是要在客户端与服务器之间创建和保持稳定可靠的连接。其实它是一种很早就存在的技术,但是由于浏览器技术的发展比较缓慢,没有为这种机制的实现提供很好的支持。所以要达到这种效果,需要客户端和服务器的程序共同配合来完成。通常的做法是,在服务器的程序中加入一个死循环,在循环中监测数据的变动。当发现新数据时,立即将其输出给浏览器并断开连接,浏览器在收到数据后,再次发起请求以进入下一个周期,这就是常说的长轮询(long-polling)方式。如下图所示,它通常包含以下几个关键过程:

  1. 轮询的建立
    建立轮询的过程很简单,浏览器发起请求后进入循环等待状态,此时由于服务器还未做出应答,所以HTTP也一直处于连接状态中。
  2. 数据的推送
    在循环过程中,服务器程序对数据变动进行监控,如发现更新,将该信息输出给浏览器,随即断开连接,完成应答过程,实现“服务器推”。
  3. 轮询的终止
    轮询可能在以下3种情况时终止:
    3.1. 有新数据推送
    当循环过程中服务器向浏览器推送信息后,应该主动结束程序运行从而让连接断开,这样浏览器才能及时收到数据。
    3.2. 没有新数据推送
    循环不能一直持续下去,应该设定一个最长时限,避免WEB服务器超时(Timeout),若一直没有新信息,服务器应主动向浏览器发送本次轮询无新信息的正常响应,并断开连接,这也被称为“心跳”信息。
    3.3. 网络故障或异常
    由于网络故障等因素造成的请求超时或出错也可能导致轮询的意外中断,此时浏览器将收到错误信息。
  4. 轮询的重建
    浏览器收到回复并进行相应处理后,应马上重新发起请求,开始一个新的轮询周期。

http://chatgpt.dhexx.cn/article/KwI1suVq.shtml

相关文章

Linux轮询操作

Linux设备之非阻塞I/O操作 文章目录 Linux设备之非阻塞I/O操作前言一、接口简介1、select2、poll3、epoll4、总结 二、接口介绍三、代码样例 前言 上一篇讲解了Linux设备的阻塞I/O操作&#xff0c;其原理是利用了把进程挂到等待队列中&#xff0c;等条件满足时再唤醒此进程。本…

短轮询和长轮询

轮询是由客户端每隔一段时间向服务器发出HTTP请求&#xff0c;服务端接收到请求后向客户端返回最新的数据。 客户端的轮询方式一般分为短轮询和长轮询。 短轮询&#xff1a; 一般是由客户端每隔一段时间向服务器发起一次普通HTTP请求。服务端查询当前接口是否有数据更新&#x…

轮询与长轮询

轮询&#xff1a;说白了就是客户端定时去请求服务端&#xff0c; 是客户端主动请求来促使数据更新&#xff1b; 长轮询&#xff1a;说白了 也是客户端请求服务端&#xff0c;但是服务端并不是即时返回&#xff0c;而是当有内容更新的时候才返回内容给客户端&#xff0c;从流程…

前端实现轮询

方法一&#xff1a;简单实现 componentDidMount() {this.props.countFxMissionByStatus();countSwiftMessage(); }componentWillReceiveProps(nextProps) {const {location} nextProps;// 判断页面然后在更新的周期中实现轮询const isSwiftManage location.pathname.indexOf…

NGINX轮询机制的几种形式

前言&#xff1a;总以为轮询就简单的next而已&#xff0c;实际还有几种不同的实现机制。某个客户的源站有几个不同的IP&#xff0c;回源的时候自然是采用的轮询的机制。客户业务上线前&#xff0c;检查源站的联通性发现一个漏网之鱼竟然差点滥竽充数。然而客户的想法确是&#…

事件轮询机制理解

进程与线程 首先简单了解下进程和线程的概念 进程&#xff1a;cpu资源分配的最小的单位&#xff0c;是拥有资源和独立运行的最小单位&#xff0c;程序执行时&#xff0c;会创建一个进程&#xff0c;cpu为其分配资源&#xff0c;并加入进程就绪队列。线程&#xff1a;cpu调度的…

事件轮询机制

事件循环(轮询)机制 js是单线程的所有js代码都是在主线程执行的同步任务进入主线程即会执行异步任务则会进入浏览器的管理模块 (有DOM事件管理模块、ajax请求管理模块、定时器管理模块等)管理模块一直监视异步任务是否满足条件。如果满足条件则会将对应的回调放入回调队列中(c…

IP多播(组播)

一 IP多播的基本概念 IP多播(multicast&#xff0c;也被译为组播)&#xff0c;它是一种一对多的通信方式。与单播相比&#xff0c;多播可以大大节约网络资源。 以视频流媒体服务为例说明单播和多播的区别&#xff0c;如图所示&#xff1a; 图1 单播与多播的比较 (a) 中使用的…

多播

19.1 概述 单播地址标识单个接口&#xff0c;广播地址标识子网上的所有接口&#xff0c;多播地址标识一组接口。单播和广播是编制方案的两个极端(要么一个要么全部)&#xff0c;多播的目的就在于提供一种折衷方案。多播数据报仅由对该数据报感兴趣的接口接收&#xff0c;也就是…

单播 、多播(组播)、广播

作者&#xff1a;yhthu 链接&#xff1a;https://www.jianshu.com/p/cc62e070a6d2#comments 来源&#xff1a;简书 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 目录 单播、多播(组播)、广播、任播单播组播广播任播 单播、多播(组播)、广…

UDP之多播/组播

目录 一.什么是多播(组播)&#xff1f;为什么出现多播(组播)&#xff1f;二.组播地址三.主机网卡对应的编号 ifconfig命令ip ad (ip adress)获取网卡对应的编号四.多播实现 一.什么是多播(组播)&#xff1f;为什么出现多播(组播)&#xff1f; 由上节课讲到的广播&#xff0c;可…

单播、多播和广播经典详解

1 什么是单播、多播和广播 “单播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“广播”&#xff08;Broadcast&#xff09;这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思&#xff1f;区别何在…

多播--概念和编程

11.3 多播 单播用于两个主机之间的端对端通信&#xff0c;广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端&#xff0c;要么对一个主机进行通信&#xff0c;要么对整个局域网上的主机进行通信。实际情况下&#xff0c;经常需要对一组特定的主机进…

单播、多播(主播)、广播简介

单播 简介 单播&#xff08;unicast&#xff09;是指封包在计算机网络的传输中&#xff0c;目的地址为单一目标的一种传输方式。每次只有两个实体相互通信&#xff0c;发送端和接收端都是唯一确定的。它是现今网络应用最为广泛&#xff0c;通常所使用的网络协议或服务大多采用…

IP多播

部分转载自&#xff1a;http://www.firewall.cx/networking-topics/general-networking/107-network-multicast.html 剩下的基本参考谢希仁计算机网络7th 1. 基本概念 IP多播直观上可以按照下图理解&#xff0c;源主机只需要发送一份数据&#xff0c;而网络中的路由器在转发…

多播(组播)、单播、任播和广播

定义 单播(unicast): 是指封包在计算机网络的传输中&#xff0c;目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛&#xff0c;通常所使用的网络协议或服务大多采用单播传输&#xff0c;例如一切基于TCP的协议。组播(multicast): 也叫多播&#xff0c; 多点广播或…

IP多播(计算机网络-网络层)

目录 一对多通信的应用需求 单播 vs 多播 多播路由器&#xff08;Multicast Router&#xff09; IP 多播的一些特点 D 类 IP 地址与以太网多播地址的映射关系 IP多播需要两种协议 互联网组管理协议 IGMP 多播路由选择协议 两种多播路由选择方法 建议的IP多播路由选择协…

组播,多播

组播&#xff0c;多播&#xff1a;当网络中进行了组播网部署后&#xff0c;一个台设备仅需要基于一个流量进行一次封装及可将该流量转发到所有的组员处&#xff0c;这些组员可处在网络的任何位置&#xff1b;对非组员不产生影响。再未进行组播网络部署的环境下&#xff0c;以组…

网络-单播、多播(组播)和广播的区别

网络-单播、多播&#xff08;组播&#xff09;和广播的区别 转载声明 本文大量内容系转载自以下文章&#xff0c;有删改&#xff0c;并参考其他文档资料加入了一些内容&#xff1a; 单播、多播&#xff08;组播&#xff09;和广播的区别 作者&#xff1a;Roger Luocnblogs 带…

【TCP/IP】多播 - 定义、原理及编程实现 (TTL、多播组、多播消息)

目录 多播 多播的原理 多播的数据传输时的特点 TTL 的概念 TTL 和 多播组的配置方法 多播的编程与实现 发送者 接收者 多播 多播是一种介于单播和广播通信之间的技术方式&#xff0c;可以将发送者所需要发送的数据包分别发送给分散在不同子网中的一组接收者。 多播的原…