长轮询与长连接

2023-10-29

实现即时通讯主要有四种方式,它们分别是轮询、长轮询(comet)、长连接(SSE)、WebSocket。

它们大体可以分为两类:

一种是在HTTP基础上实现的,包括短轮询、comet和SSE;

另一种不是在HTTP基础上实现是,即WebSocket。

长轮询(comet)

客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。

实例:WebQQ、Hi网页版、Facebook IM。

长连接(SSE)

在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。

优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销。

实例:Gmail聊天

SSE是HTML5新增的功能,全称为Server-Sent Events。它可以允许服务推送数据到客户端。SSE在本质上就与之前的长轮询、短轮询不同,虽然都是基于http协议的,但是轮询需要客户端先发送请求。而SSE最大的特点就是不需要客户端发送请求,可以实现只要服务器端数据有更新,就可以马上发送到客户端。

SSE的优势很明显,它不需要建立或保持大量的客户端发往服务器端的请求,节约了很多资源,提升应用性能。并且后面会介绍道,SSE的实现非常简单,并且不需要依赖其他插件。

WebSocket

WebSocket是Html5定义的一个新协议,与传统的http协议不同,该协议可以实现服务器与客户端之间全双工通信。简单来说,首先需要在客户端和服务器端建立起一个连接,这部分需要http。连接一旦建立,客户端和服务器端就处于平等的地位,可以相互发送数据,不存在请求和响应的区别。

WebSocket的优点是实现了双向通信,缺点是服务器端的逻辑非常复杂。现在针对不同的后台语言有不同的插件可以使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

长轮询与长连接 的相关文章

  • 我可以用 HTML5/JS 编写文件吗?

    我想知道是否有什么方法可以从 HTML5 JS 写入文件 在浏览器中 假设您的最终目标是让用户将您的文件保存在他们能找到的地方 例如右键单击链接并选择 另存为 时 这些 API 的浏览器覆盖范围还不够广泛 这可能是由于出于安全考虑 然而 无
  • 回到使用 ajax 的 PushState 条目

    我对以下情况有疑问 用户访问网站 用户点击使用history pushState的链接来更新url 通过ajax加载部分页面内容 使用jQuery 用户单击加载新页面的常规链接 用户点击返回返回到pushState条目 该页面现在仅显示通过
  • 将 JSON 发布到 Python CGI

    我已经安装了 Apache2 并且 Python 可以工作 但我有一个问题 我有两页 一个是 Python 页面 另一个是带有 JQuery 的 Html 页面 有人可以告诉我如何让我的 ajax 帖子正常工作吗
  • 如何使用 jQuery Ajax 将 PHP 数组值传递到另一个文件?

    这是我的代码
  • ASP.net Gridview 分页在 UpdatePanel 中不起作用

    虽然类似的问题已经被问过很多次了 但问题仍然没有解决 这是问题 我有一个GridView它包含在选项卡容器中AJAX控件本身位于UpdatePanel Gridview工作得很好并且其相应的方法被准确地触发 但是当我启用paging 例如
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 使用异步调用时如何从 javascript 更新元刷新?

    我有一个系统 它使用元刷新来注销页面 该系统会在空闲用户后进行清理 不用担心 服务器也会导致会话超时 我开始通过 ajax 进行一些操作 不是真正的 xml 但这不是重点 我可以运行从异步请求返回的javascript 所以我想知道是否可以
  • json_encode 返回 200 且未定义

    我想要一个代码来添加或删除数据库书签 代码已准备就绪 它可以正确地从数据库书签中添加和删除书签 但是当我调用该函数时 它会不断返回json error反而json success即使代码有效 我想知道代码 我从其他地方获得并改编的 有什么问
  • React.js 和 Ajax 之间的区别

    当我在 google 上搜索 React js 时 我得到的是 React js 是一个用于创建用户界面的框架 如果网站的某个特定部分经常更新 则意味着我们可以使用 React 但我很困惑 Ajax 仅用于此目的 我们可以使用 Ajax 更
  • 未捕获的类型错误:未定义不是函数

    我收到消息Uncaught TypeError Undefined is not a function当我尝试调用家庭控制器中的方法时 也许关于我为什么收到此消息的建议 findIdpActivities function pernr ca
  • 预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Origin

    当我尝试加载网页时 出现以下错误 预检响应中的 Access Control Allow Headers 不允许请求标头字段 Access Control Allow Origin 我查看了针对此问题的其他答案 它们表明缺乏 CORS 支持
  • Ajax调用完成后执行函数

    我是 Ajax 新手 我尝试在使用 for 循环时使用 Ajax Ajax 调用之后 我正在运行一个使用 Ajax 调用中创建的变量的函数 该函数只执行两次 我认为 Ajax 调用可能没有足够的时间在循环开始之前进行调用 有没有办法在运行
  • SetInterval 函数不适用于 PHP 文件

    我有这样的index html
  • 使用 JSF 2.0 Ajax 响应访问 bean 函数的返回值?

    我正在使用 JSF 2 0 构建一个调度应用程序 用户可以在其中将项目添加到日历中 然后编辑这些对象 我广泛使用 AJAX 来防止页面刷新 我遇到的问题是从使用 AJAX 调用的函数中获取返回值
  • jquery comet 长轮询和流媒体教程? [复制]

    这个问题在这里已经有答案了 可能的重复 彗星和 jQuery https stackoverflow com questions 136012 comet and jquery 我厌倦了找不到关于 jquery 长轮询 流彗星技术的好的教程
  • 如何从 Python 返回 JSON 值?

    我从如下所示的 jQuery 文件发送 ajax 请求 该请求需要 JSON 格式的响应 jQuery ajax url Control getImageDetails file id currentId type GET contentT
  • 从 asp.net mvc ajax 调用 wcf

    我有两个应用程序 第一个是 WCF 服务 第二个是 asp net MVC 3 应用程序 在 WCF 应用程序中我有一个界面 ServiceContract public interface IService1 OperationContr
  • (Django) AJAX 请求的 CSRF 验证在 Chrome 中工作,但在 Firefox 中不起作用

    正如标题所述 我的 Django CSRF 验证在 Chrome 中有效 但在 Firefox 中无效 我想知道原因 以便解决此问题 我已将此包含在head我的标签基本 html我的应用程序中的所有其他文件都从中扩展的文件 base htm
  • MPI 从文本文件中读取

    我正在学习 MPI 编程 我遇到了这个问题 假设我有一个包含 100 000 行 行的 txt 文件 如何将它们分块以供 4 个处理器处理 即我想让处理器 0 负责第 0 25000 行的处理 让处理器 1 负责第 25001 50000

随机推荐

  • 解决 微软应用商店无法联网 0x80072EFD问题

    近期使用微软应用商店发现不能正常的连接网络 小娜也是 经过检查是使用了代理自动配置脚本 PAC 的原因 按win键 输入网络代理设置 打开代理设置界面 设置 使用安装程序脚本 为关
  • SpringBean的生命周期

    Spring Bean Lifecycle 1 过程 1 调用无参构造 2 执行 set 方法设置属性 也可以是 Bean 注解方法内容 3 调用 BeanNameAware 的 setBeanName 方法 可以获得 Bean 的名字 4
  • 0N在计算机里面起什么作用,计算器0n/c是什么键

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 计算器0n c是开机键以及清屏键 此键一方面有着开机的功能 另一方面也有着清除屏幕内容的功能 计算器是现代人发明的可以进行数字运算的电子机器 现代的电子计算器能进行数学运算
  • 在微软任职近 20 年,Windows、Surface 负责人官宣将离职!

    整理 屠敏 出品 CSDN ID CSDNnews 9 月 19 日 据外媒 The Verge 报道 负责领导 Windows 开发和 Surface 产品线的微软首席产品官 CPO Panos Panay 即将离职 这一消息来得很突然
  • XML基本规则(XML语法规则)

    XML基本规则 XML语法规则 1 XML 文档必须包含在一个单一元素中 2 XML 元素不能重叠 必须正确的嵌套 3 不能省去任何结束标记 或者说标记必须成对 4 XML 元素是区分大小写的 也就是大小写敏感 5 XML 文档中的属性有两
  • 源码安装zabbix

    源码安装zabbix 1 zabbix简介 2 zabbix的主要功能 3 监控指标 4 zabbix配置文件 5 服务器端配置文件 6 客户端配置文件 7 部署zabbix 8 先安装apache 8 1 安装开发工具包 8 2 下载ap
  • python使用plt.savefig保存时图片保存不完整,四周留白太多

    问题 今天在给论文添加曲线图 使用matplotlib的savefig函数中遇到图片保存不完整 且留白太多的问题 插入到论文中很难看 左边是在pycharm里的截图 右边是通过savefig保存的图片 代码如下 保存图片 plt savef
  • 怎样在PB中实现文件的拷贝与删除 (转)

    怎样在PB中实现文件的拷贝与删除 转 more 怎样在PB中实现 文件的拷贝与删除 可借助外部 函数 可用 api函数实现 1 文件拷贝 函数声明 FUNCTION boolean CopyFileA ref string cfrom re
  • 安装及使用ceres遇到过的问题

    首先ceres安装及使用需要两个依赖库glog与gflags 这两个库安装时需要注意要么只用apt install要么只用源码编译安装 如果两个都装了用apt purge或者在 usr local lib及 usr local includ
  • 设置Unity的帧率

    问题描述 Xsens接收数据的频率是30Hz 为了接收到正确 完整的数据 要将Unity的帧率换成30帧 第一种方法 点击Editor gt Project Setting gt Quality 将VSync Count那选择Every S
  • 测试框架pytest教程(4)运行测试

    运行测试文件 pytest q test example py 会运行该文件内test 开头的测试方法 该 q quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中 但如果写在类中 类名需要是Test开头 非Test开
  • C/C++中使用Base64编码解码(使用boost库)

    Base64是一种用64个字符来表示任意二进制数据的方法 用记事本打开exe jpg pdf这些文件时 我们都会看到一大堆乱码 因为二进制文件包含很多无法显示和打印的字符 所以 如果要让记事本这样的文本处理软件能处理二进制数据 就需要一个二
  • c++判断硬盘是否连接、修改指定盘符、读取配置文件、获取exe路径

    系统 win7 64 编译器 vs2010 mfc对话框程序 工程名 fixde 语言 c 涉及函数 GetPrivateProfileString 读取配置文件内容 类型为string GetDriveType 获取某驱动器状态 GetV
  • w5500 php,[W5500]搭建属于你的家庭网络实时监控

    图9 OV2640 SVGA模式下图像输出时序图 系统上电后 MCU配置OV2640的工作方式 在OV2640准备好图像后 VSYNC会被拉高一段时间 MCU通过PCLK上升沿中断按字节接收图像数据 接下来我们将对OV2640的初始化配置程
  • 编写测试用例的基本方法之边界值

    一般边界值分析是因为程序开发循环体时的取数可能会因为 lt lt 搞错 比如下面代码 for int i 0 i lt 100 i int j i 1 System out println 循环第 j 次 循环地做某件事情 这里的程序是循环
  • 如何点击按钮把光标定位到想要的el-input中

    1 el inpu
  • C语言-结构体面向对象编程技巧

    Keil4 C51工程网址 https yunpan 360 cn surl yrNkQSrCKyc 一 面向对象 面向对象是软件开发方法 是相对于面向过程来讲的 通过把数据与方法组织为一个整体来看待 从更高的层次来进行系统建模 更贴近事物
  • python3 数据类型归纳

    1 简介 1 1 python3 数据类型 类型 含义 示例 int 整型 1 float 浮点型 1 0 bool 布尔值 True或False complex 复数 a bj string 字符串 abc123 list 列表 a b
  • 别被骗了,win10家庭版MMC是无法创建管理单元的

    今天我的PC 是win10家庭版 无法出现gpedit msc 然后下载gpedit msc 后 又出现MMC无法创建管理单元 家庭版是没有组策略和注册表的 家庭版是没有组策略和注册表的 家庭版是没有组策略和注册表的 重要的事情说三遍 下面
  • 长轮询与长连接

    实现即时通讯主要有四种方式 它们分别是轮询 长轮询 comet 长连接 SSE WebSocket 它们大体可以分为两类 一种是在HTTP基础上实现的 包括短轮询 comet和SSE 另一种不是在HTTP基础上实现是 即WebSocket