为啥我在 Node 的 HTTP 服务器上收到这么多连接事件?
Posted
技术标签:
【中文标题】为啥我在 Node 的 HTTP 服务器上收到这么多连接事件?【英文标题】:Why I got so many connection events on Node's HTTP server?为什么我在 Node 的 HTTP 服务器上收到这么多连接事件? 【发布时间】:2015-06-16 07:47:21 【问题描述】:我有一个使用 socket.io 的 Web 应用程序。它在我的本地机器上的 localhost:8000 上运行。为了在我的应用程序中找到烦人的资源泄漏,我尝试在我的 HTTP 服务器上注销连接事件:
server.on('connection', function(conn)
//log out connection details
);
当我在页面加载后在浏览器中打开页面时,我可以在日志中看到多个连接事件 - 如下所示:
connection established: 127.0.0.1:54148
connection established: 127.0.0.1:54149
connection established: 127.0.0.1:54146
connection established: 127.0.0.1:54152
connection established: 127.0.0.1:54144
connection established: 127.0.0.1:54155
奇怪的是我没有在页面加载后创建 WebSocket 连接——只有当用户点击一个按钮时。但是我没有点击任何按钮,我仍然看到这些奇怪的连接。
如果我点击按钮通过 socket.io 连接到我的服务器,日志会显示一个新连接:
connection established: 127.0.0.1:54155
幸运的是,我在日志中看到的每个连接都在一段时间后关闭 - 所以我想这不是我的资源泄漏的原因。
但我仍然很好奇:是什么导致了这些连接事件?为什么端口号这么奇怪(不是我的服务器监听的 8000)?
编辑:
我的服务器配置不是特别的。在server.js
:
var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var configSettings = require('./configSettings');
var socketioserver = require('./server/socketServer')(io); // config socketServer
require('./server/static.js')(app, express); // static middleware
require('./server/routes.js')(app, configSettings); // routes
exports = module.exports = server;
exports.use = function()
app.use.apply(app, arguments);
;
exports.configSettings = configSettings;
在start.js
:
var server = require('./server');
var port = server.configSettings.serverPort;
var serverIpAddress = server.configSettings.serverIpAddress;
server.listen(port, serverIpAddress);
【问题讨论】:
端口号是客户端的端口号,而不是服务器的端口号。你能看到你的浏览器建立这些连接吗(在开发工具窗口中)? 这可以解释奇怪的端口号。是否有可能每个 HTTP 请求都会导致连接事件? (即请求网站图标、CSS 文件等) 我也是这么想的,是的。但是浏览器应该有理由认为它可以在你的 socket.io 服务器上找到资源;也许您可以为您的问题添加更多上下文(关于您的服务器设置,如果您还从同一端口运行 HTTP 服务器等)。 我将 socket.io 与 express 一起使用,并且都在同一个端口 (8000) 上侦听。奇怪的是,来自浏览器的每个请求都有不同的端口... 我错误地认为日志消息来自 socket.io,但它们来自 HTTP 服务器。在这种情况下, 会为对服务器的每个请求生成,包括 JS/CSS/favicon)。换句话说,这是正常行为:-) 【参考方案1】:您从 HTTP 服务器记录的连接是正常的,并且与您的 html 页面上使用的资源(JS、CSS、图像、网站图标等)相关。
您记录的端口号是客户端端口号。虽然不是随机的,但它们会随着您服务器的每个新连接而改变。资源交付给客户端后(取决于保持活动状态,需要额外的时间),连接将关闭。
一般来说,Node 可以处理数千个并发连接。
这显然不能解决您的资源泄漏问题,但它解释了您看到的连接事件。
【讨论】:
以上是关于为啥我在 Node 的 HTTP 服务器上收到这么多连接事件?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在 Gitlab CI/CD 管道上的 Docker 中收到“不允许跨设备链接”错误?
为啥我最近从运行 Android 10 的三星设备上收到这么多 InflateException 崩溃?
为啥我在我的设备上收到成功注册消息,而服务器数据库没有变化?