Js的长轮询[通俗易懂]

Js的长轮询[通俗易懂]长轮询是与服务器保持持久连接的最简单的方式,它不使用任何特定的协议,例如WebSocket或者ServerSentEvent。它很容易实现,在很多场景下也很好用。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

长轮询(Long polling)

长轮询是与服务器保持持久连接的最简单的方式,它不使用任何特定的协议,例如 WebSocket 或者 Server Sent Event。

它很容易实现,在很多场景下也很好用。


常规轮询

从服务器获取新信息的最简单的方式是定期轮询。也就是说,定期向服务器发出请求:“你好,我在这儿,你有关于我的任何信息吗?”例如,每 10 秒一次。

作为响应,服务器首先通知自己,客户端处于在线状态,然后 —— 发送目前为止的消息包。

这可行,但是也有些缺点:

  1. 消息传递的延迟最多为 10 秒(两个请求之间)。
  2. 即使没有消息,服务器也会每隔 10 秒被请求轰炸一次,即使用户切换到其他地方或者处于休眠状态,也是如此。就性能而言,这是一个很大的负担。

因此,如果我们讨论的是一个非常小的服务,那么这种方式可能可行,但总的来说,它需要改进。


长轮询

所谓“长轮询”是轮询服务器的一种更好的方式。

它也很容易实现,并且可以无延迟地传递消息。

其流程为:

  1. 请求发送到服务器。
  2. 服务器在有消息之前不会关闭连接。
  3. 当消息出现时 —— 服务器将对其请求作出响应。
  4. 浏览器立即发出一个新的请求。

对于此方法,浏览器发出一个请求并与服务器之间建立起一个挂起的(pending)连接的情况是标准的。仅在有消息被传递时,才会重新建立连接。

1640242367(1).png
如果连接丢失,可能是因为网络错误,浏览器会立即发送一个新请求。

实现长轮询的客户端 subscribe 函数的示例代码:

async function subscribe() {
  let response = await fetch("/subscribe");

  if (response.status == 502) {
    // 状态 502 是连接超时错误,
    // 连接挂起时间过长时可能会发生,
    // 远程服务器或代理会关闭它
    // 让我们重新连接
    await subscribe();
  } else if (response.status != 200) {
    // 一个 error —— 让我们显示它
    showMessage(response.statusText);
    // 一秒后重新连接
    await new Promise(resolve => setTimeout(resolve, 1000));
    await subscribe();
  } else {
    // 获取并显示消息
    let message = await response.text();
    showMessage(message);
    // 再次调用 subscribe() 以获取下一条消息
    await subscribe();
  }
}

subscribe();

正如你所看到的,subscribe 函数发起了一个 fetch,然后等待响应,处理它,并再次调用自身。

服务器应该可以处理许多挂起的连接

服务器架构必须能够处理许多挂起的连接。

某些服务器架构是每个连接对应一个进程,导致进程数和连接数一样多,而每个进程都会消耗相当多的内存。因此,过多的连接会消耗掉全部内存。

使用像 PHP 和 Ruby 语言编写的后端程序会经常遇到这个问题。

使用 Node.js 编写的服务端程序通常不会出现此类问题。

也就是说,这不是编程语言的问题。大多数现代编程语言,包括 PHP 和 Ruby,都允许实现更适当的后端程序。只是请确保你的服务器架构在同时有很多连接的情况下能够正常工作。


使用场景

在消息很少的情况下,长轮询很有效。

如果消息比较频繁,那么上面描绘的请求-接收(requesting-receiving)消息的图表就会变成锯状状(saw-like)。

每个消息都是一个单独的请求,并带有 header,身份验证开销(authentication overhead)等。

因此,在这种情况下,首选另一种方法,例如:Websocket或 Server Sent Events


转载详情:

转载网站: Javascript.info

转载地址:https://zh.javascript.info/long-polling

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181843.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决win10 图标 显示 小白纸

    解决win10 图标 显示 小白纸参考http://www.xitongcheng.com/jiaocheng/dnrj_article_61635.html

    2022年10月19日
    3
  • uos访问windows共享打印机_Linux打印机安装命令

    uos访问windows共享打印机_Linux打印机安装命令Unraid安装CUPS实现共享打印和无线打印2020-11-2916:08:3451点赞486收藏51评论创作立场声明:个人瞎折腾,文中部分内容来自网络,本人并非专业人士,只是将个人的折腾经验分享给大家,如有错误请大家指正今年上半年买了一台高配蜗牛,蜗牛D的机箱、G5400的cpu、B365的板子,就开始了一系列的折腾,更换了8700tescpu,带pcie插槽的蜗牛C机箱,4口pci…

    2022年10月9日
    5
  • java 实现http长轮询,Long Polling长轮询实现进阶「建议收藏」

    java 实现http长轮询,Long Polling长轮询实现进阶「建议收藏」LongPolling长轮询实现进阶简书涤生。转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注。介绍由于LongPolling长轮询详解这篇文章中的code实现较为简单,尤其是服务端处理较为粗暴,有一些同学反馈希望服务端处理阻塞这块内容进行更深入讨论等等,所以这里专门补一篇实现进阶,让大家对长轮询有更加深刻的理解。疑问对上篇文章,同学反馈有两个疑问。服务端实现使用的是同…

    2022年10月10日
    3
  • android 安装p12证书,怎么使用P12证书的Android「建议收藏」

    android 安装p12证书,怎么使用P12证书的Android「建议收藏」当点击Wi-FiSettings,Advanced界面的“安装证书”;或者在Settings的Security界面下的CredentialStorage界面点击“安装证书”。com.android.certinstaller包中的CertInstallerMain类会收到Settings发送的Credentials.INSTALL_AS_USER_ACTIONintent。然后,CertIn…

    2022年6月15日
    28
  • 数据库设计工具介绍

    数据库设计工具介绍本文将从如下四个方面和您一起比较四种优秀数据库设计工具的各自优缺点。用户界面可支持的数据库数据工具售价1.DbSchema官网:https://dbschema.com/DbSchema是一种可用于复杂数据库设计和管理的可视化工具。该工具已经集成在大多数主流操作系统之中。用户界面DbSchema具有友好的用户界面,可简化数据库的设计。它能够为管理大型数据库提供友好的界面布局,以便用户更专注于数据库的特定功能。如下图所示,DbSchema界面能够让用户自由地浏览各种视图,在布局中拖放表格,

    2022年7月11日
    32
  • 关于ubuntu kill 硬盘问题

    关于ubuntu kill 硬盘问题

    2021年5月3日
    164

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号