Chrome 和 Firefox 中的 WebSocket 在不活动一分钟后断开连接

2024-03-09

我发现 Chrome 和 Firefox 中的 WebSocket 在闲置一分钟后就会断开连接。根据我在网上看到的内容,我完全将责任归咎于代理或某些服务器设置或其他东西,但在 IE 或 Edge 中不会发生这种情况。看起来如果套接字在一分钟不活动后被服务器断开连接,这将适用于 IE 和 Edge,就像 Chrome 和 Firefox 一样。

有人知道为什么吗?它在任何地方都有记录吗?我知道一种可能的方法是通过 ping 来阻止它,但我更感兴趣的是为什么会发生这种情况。断开连接时给出的原因代码是 1006,表明浏览器关闭了连接。不会引发任何错误,也不会触发套接字的 onerror 事件。

该项目建于https://glitch.com/edit/#!/noiseless-helmet https://glitch.com/edit/#!/noiseless-helmet您可以在其中查看并运行所有内容。客户端页面在这里提供:https://noiseless-helmet.glitch.me/ https://noiseless-helmet.glitch.me/

这是我的客户页面:

<div id="div">
</div>
<script>
  let socket = new WebSocket("wss://noiseless-helmet.glitch.me/");
  socket.onmessage = function(event) {
    div.innerHTML += "<br>message " + new Date().toLocaleString() + " " + event.data;
  };
  socket.onopen = function (event) {
    div.innerHTML += "<br>opened " + new Date().toLocaleString();
    socket.send("Hey socket! " + new Date().toLocaleString());
  };
  socket.onclose = function(event) {
    div.innerHTML += "<br>socket closed " + new Date().toLocaleString();
    div.innerHTML += "<br>code: " + event.code;
    div.innerHTML += "<br>reason: " + event.reason;
    div.innerHTML += "<br>clean: " + event.wasClean;
  };
  socket.onerror = function(event) {
    div.innerHTML += "<br>error: " + event.error;
  };
</script>

这是我的 Node.js 服务器代码:

var express = require('express');
var app = express();
app.use(express.static('public'));

let server = require('http').createServer(),
  WebSocketServer = require('ws').Server,
  wss = new WebSocketServer({ server: server });

app.get("/", function (request, response) {
  response.sendFile(__dirname + '/views/index.html');
});

let webSockets = [];
wss.on('connection', function connection(socket) {
  webSockets.push(socket);
  webSockets.forEach((w) => { w.send("A new socket connected"); });
  socket.on('close', (code, reason) => {
    console.log('closing socket');
    console.log(code);
    console.log(reason);
    let i = webSockets.indexOf(socket);
    webSockets.splice(i, 1);
  });
});

server.on('request', app);
server.listen(process.env.PORT, function () {
  console.log('Your app is listening on port ' + server.address().port);
});

看起来如果套接字在一分钟不活动后被服务器断开连接,这将适用于 IE 和 Edge,就像 Chrome 和 Firefox 一样。

嗯,不,不是。 IE 和边缘might正在实施一个ping数据包作为 WebSocket 协议的一部分。

WebSocket 协议包括对协议级别的支持ping https://www.rfc-editor.org/rfc/rfc6455#page-37JavaScript API 不会公开。它比通常实施的用户级别 ping 级别要低一些。

This ping-pong流量会重置任何网络中介(代理、负载均衡器等)中的计时器 - 并且它们都会对连接进行计时,以标记陈旧的连接以关闭(例如,Heroku 设置连接时间为 55 秒 https://devcenter.heroku.com/articles/limits#router).

大多数浏览器信任服务器来实现ping,这是礼貌的(因为服务器需要管理其负载和 ping 超时...

...然而,这也有点令人沮丧,因为浏览器不知道连接是否异常丢失,并且 JavaScript 不会为 WebSocket 协议发出事件ping。这就是为什么许多 JavaScript 客户端实现用户级 ping(即 JSON{event: "ping", data: {...}}或另一个“空”事件消息)。

不管怎样,我只是想指出你的假设是不正确的,这仍然是一个超时发生,浏览器行为的差异可能与浏览器本身有关。

有关 nginx 默认超时(代理 WebSocket 连接时)的一些具体信息,您可以阅读 @Hendry 的答案。

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

Chrome 和 Firefox 中的 WebSocket 在不活动一分钟后断开连接 的相关文章

  • Ext JS - 如何滚动到文本区域的底部

    这是我下面的代码 如何滚动到文本区域的底部 它一定是类似的东西 Ext getCmp output setScrollPosition Ext getCmp output getScrollHeight 这是我的文本区域代码 var myW
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • Flask wtf.quick_form 运行一些 javascript 并设置表单变量

    我正在创建博客文章 到目前为止已经使用普通的 html 表单完成了 我所做的一个有趣的想法是运行 javascript onclick 并使用页面中的额外数据在表单中设置一个隐藏变量 这很好地传递到服务器并通过 request form 获
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 创建 Cookie 时需要帮助

    我有一个名为yes和另一个名叫no
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • ElectronJS ReferenceError:导航器未定义

    我正在尝试在电子上制作自定义标题栏 但是当我启动我的应用程序时 我遇到了 ReferenceError 导航器未定义 问题 请帮忙 这是我的 main js 中的代码片段 My Codes https i stack imgur com c
  • 保存/导出Chrome的JavaScript控制台输入历史记录

    无论如何 我可以保存或导出 JavaScript 控制台的历史记录吗 input 控制台历史记录 在 Google Chrome 中 我不想保存输出或错误 因此将鼠标悬停在控制台框上 右键单击并选择Save as 不是解决方案 我不想每次都
  • 由于缺少会话而在 Next.js 中使用 Next-Auth 进行重定向时,如何显示 Toast 通知? [复制]

    这个问题在这里已经有答案了 例如 假设我有一个名为internal tsx 的页面 其中包含 export const getServerSideProps GetServerSideProps async ctx gt const ses
  • AJAX:检查字符串是否为 JSON?

    我的 JavaScript 有时会在这一行崩溃 var json eval this responseText 当争论时会导致崩溃eval 不是 JSON 在进行此调用之前有什么方法可以检查字符串是否为 JSON 我不想使用框架 有什么方法
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • 使用 jquery 将字符串数组转换为整数

    我正在尝试将 jquery 中的字符串数组转换为整数数组 这是我的尝试 var cdata data values split each cdata function i l l parseInt l 我认为在这种情况下你不需要使用 Jqu
  • 使水平滚动条始终可见,即使底部不在视图中

    我将用一个片段来开始这个问题 该片段几乎显示了我想要完成的任务 wrapper overflow hidden display flex sidebar min width 200px background 333 color FFF co
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • Restangular - _.contains() 不是一个函数

    如果您最近通过 Bower 更新了 Restangular 它将安装最新的 Lodash 新的 4 0 然而 这是一个问题 因为 Restangular Angular 现在会抛出错误 contains 不是函数 你怎么解决 解决方案非常简
  • 在 javascript 中使用 xPath 解析具有默认命名空间的 XML

    我需要创建一个 XML xPath 解析器 所有解析都必须在客户端进行 使用 JavaScript 我创建了一个 javascript 来执行此操作 在默认名称空间发挥作用之前 一切看起来都正常 我根本无法查询具有默认命名空间的 XML 我

随机推荐

  • .one() 和 .scalar() 有什么区别

    之间的主要区别是什么 one and scalar 在 SQLAlchemy 中 因为两者都执行相同的工作 我看到一些网站 例如教程点 com https www tutorialspoint com sqlalchemy sqlalche
  • 从已建立的 SqlConnection 确定 TLS 版本

    在实时系统中 我们使用以下命令与各种 MSSQL 服务器建立多个连接SqlConnectionC 中的对象 由于客户端正在将其 SQL 服务器更新到 TLS 1 2 我想知道是否有办法确定活动连接上正在使用哪种 TLS 实现 如果可能的话
  • List 上的 Any() 方法无法按预期工作

    我正在 winforms 中开发 net 4 6 这里的代码来自测试控制台应用程序 有一次我有一张清单DateTime我需要弄清楚这个列表是否包含特定日期 为此我正在尝试使用Any 在名单上 即使列表确实包含所需的日期 Any 回报fals
  • 自动换行不适用于 UILabel

    使用自动布局我无法在代码中覆盖我的标签 我已经在 IB 中设置了标签属性 Lines 0 LineBreaks Word Wrap 但我将高度设置为单行 因为选择的单元格决定了标签中的文本内容 所以有时标签只有一行 在我看来DidLoad
  • 日期格式中月份和日期的固定长度?

    有没有什么方法可以将日期对象格式化为固定长度的日和月 以便在列中良好对齐 例如 15 May 2010 10 January 2010 代替 15 May 2010 10 January 2010 Thanks 看看java util Fo
  • 通过 C++ 程序在 PowerShell 中打印 unicode 字符

    我的最终目标是通过 C 程序将一些非拉丁文本输出写入 Windows 中的控制台 cmd exe 对我毫无帮助 所以我得到了最新的 闪亮的 PowerShell 版本 支持 unicode 我已经确认我可以 输入非 unicode 字符和
  • jQuery - 如何检查特定 DIV 中是否单击了任何链接?

    在 HTML 代码中 我的页面包含 div a href Link1 a a href Link2 a div div a href Link info a a href My profile a div div a href Link1
  • Flask 和 sys.excepthook

    我想将全局异常处理对象添加到我的 Flask web 项目中 在创建应用程序类的主模块中 我添加了代码来覆盖sys excepthook 这是简单的测试代码 import sys def my exception hook exceptio
  • 字符串分词器、分隔符

    我正在使用这段代码 StringTokenizer tokenizer new StringTokenizer line 分割以下字符串 hi my name is visghal what is yor name name being t
  • after_initialize 和 after_find 回调在 Active Record 对象生命周期中的顺序?

    来自 Rails 指南 回调可以挂接到 Active Record 对象的生命周期中 按照执行顺序 它们是 从 Rails Guides 复制的 创建对象 before validation after validation before
  • 组合最新第一个事件未触发

    我想知道我的应用程序何时离线并重新上线 我在以下位置注册了以下事件rxjs const online Rx Observable fromEvent window online const offline Rx Observable fro
  • 如何设置 WebMatrix/Razor 响应的内容类型?

    我想在我的 WebMatrix cshtml 文件中返回一些 XML 而不是 HTML 如何更改内容类型标头 使用 cshtml 文件顶部的 Response ContentType 属性 然后将 XML 包含在视图的内容中 Respons
  • 如何计算文本的真实SHA1?

    As in 我的最后一个问题 https stackoverflow com q 48327289 287948 参见那里的详细信息 我正在使用 SELECT encode digest x text bytea sha1 hex FROM
  • 检查 UITextView 中的文本是否由于自动换行而换行

    如何检查文本是否在UITextView由于自动换行而转到下一行 我目前有代码来检查用户是否输入新行 从键盘 BOOL textView UITextView textView shouldChangeTextInRange NSRange
  • 使用 OpenCV 时找不到模块 cv2

    我已经安装了OpenCV https en wikipedia org wiki OpenCV在 Raspberry Pi 上的 Occidentalis 操作系统 Raspbian 的一个变体 上 使用这个脚本 https github
  • Graphql 和往返。这只是ios应用程序的问题吗?

    我正在重新审视 graphql 我试图理解为什么节省往返对开发人员有好处 提出请求的费用这么贵吗 我有网络开发背景 让我们将标准 Rest api 与 graphql api 进行比较 我需要检索用户的个人信息及其朋友列表 传统的 Rest
  • 在 jQuery UI 中触发鼠标拖动

    使用 jQuery 1 2 x 和 jQuery UI 1 5 x 可以像这样手动触发拖动 jQuery myDiv mousedown function ev target jQuery ev target if target hasCl
  • Laravel 5 销毁所有用户会话并强制注销

    有没有办法销毁所有会话 我需要注销所有用户 想知道 astrisan 是否可以做到这一点 谢谢你 这实际上取决于您选择的会话驱动器 如果您使用文件驱动器 您可以删除storage framework sessions path 如果您使用数
  • PHP 匿名函数与 array_walk

    我尝试将 array walk 与匿名函数一起使用 但总是收到错误 Parse error syntax error unexpected T FUNCTION in on line X if empty myArray array wal
  • Chrome 和 Firefox 中的 WebSocket 在不活动一分钟后断开连接

    我发现 Chrome 和 Firefox 中的 WebSocket 在闲置一分钟后就会断开连接 根据我在网上看到的内容 我完全将责任归咎于代理或某些服务器设置或其他东西 但在 IE 或 Edge 中不会发生这种情况 看起来如果套接字在一分钟