【问题标题】:Nodejs socket.io server optionsNodejs socket.io 服务器选项
【发布时间】:2020-04-09 14:31:06
【问题描述】:

我有一个带有以下声明的NodeJS socket.io 服务器:

const express = require("express");
const expressApp = express();
const server = http.createServer(expressApp);

const io = require('socket.io')(server, {
    pingInterval: 60000,
    pingTimeout: 10000
});

ping 间隔是服务器向客户端发送 ping 数据包的时间,而 ping 超时是如果在此期间没有收到 ping 回复,则断开连接的时间。

socket.io 服务器位于 NGINX 服务器后面,该服务器已配置为允许使用推荐的 NGINX 配置进行 socket.io 连接:https://www.nginx.com/blog/websocket-nginx/

client 中,它正在运行python 并使用此代码连接到服务器。客户端连接一次,除非客户端重新启动或退出,否则不会断开连接。客户端一直在线。

sio.connect(serverUrl + '/socket.io/')

现在的主要问题是,每分钟之后,客户端都会断开连接并连接。这不是我的初衷。最初的目的是删除无效的客户端连接。

鉴于客户端始终在线,为什么每次 [pingInterval] 都会断开连接并连接?

【问题讨论】:

  • 您是否尝试降低 pingInterval?你选择了一个相当长的间隔。某些网络基础设施可能会认为这是一个死连接,它正在杀死它。
  • 还有,对于非活动连接,nginx 上的相关超时是多少?
  • @jfriend00 我将 pingInterval 降低到 10 秒,现在似乎可以正常工作了。不再有意外断开和重新连接。对于 nginx 设置,我没有指定和超时。我使用了类似的设置,如下所示: location /wsapp/ { proxy_pass wsbackend; proxy_http_version 1.1; proxy_set_header 升级 $http_upgrade; proxy_set_header 连接“升级”; }

标签: node.js sockets nginx


【解决方案1】:

在客户端你必须使用forceNew: true

sio.connect(serverUrl + '/socket.io/',{ forceNew: true});

默认情况下,连接到不同的命名空间时使用单个连接(以最小化资源)。可以使用 forceNew 选项禁用此行为。

Socket Client Reference

【讨论】:

  • 这与套接字关闭有什么关系?
  • @jfriend00 多于一个连接时,它会断开前一个连接。所以强制它 forceNew:true 被使用。
  • 断开之前的连接会发生什么情况?我从来没有使用过forceNew,也从来没有遇到过这样的问题。
猜你喜欢
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-05-17
  • 2021-01-12
相关资源
最近更新 更多