当前位置: 首页 > 知识库问答 >
问题:

socket.io - 数百个请求而不是一个连接

桑成荫
2023-03-14

我创建了简单的应用程序来开始使用 socket.io,但是当我运行它时,Chrome(在其他浏览器中测试,结果相同)会吃掉我所有的 CPU 并发出许多请求:

我是套接字新手,但我肯定这不是它应该如何工作。在浏览器中运行的代码非常简单,它应该只连接到套接字并将所有接收到的数据记录到控制台:

索引.html

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.socket.io/socket.io-1.2.0.js" charset="UTF-8"></script>
</head>
<body>
<script type="application/javascript">
    var Sockets = io.connect('http://localhost:4000');
    Sockets.on('Test', function (data) {
        console.log(data);
    });
</script>

</body>
</html>

另外,我的服务器文件如下所示:

服务器.js

var app = require('express')();
var http = require('http').Server(app);
var bodyParser = require("body-parser");
var io = require('socket.io')(http);
var port = 4000;

http.listen(port, function () {
    console.log('Server running at port ' + port);
});

var urlencodedParser = bodyParser.urlencoded({extended: false});
app.post('/', urlencodedParser, function (req, res) {
    if (!req.body) return res.sendStatus(400);
    var post = req.body;
    io.emit("Test", post.data);
    console.log(post.data);
    res.send('true');
});

io.on('connection', function(socket){
    console.log('a user connected');
    socket.on('disconnect', function(){
        console.log('user disconnected');
    });
});

当我运行服务器节点服务器.js时,我让服务器在端口 4000 消息上运行,一切似乎都很好。但是当我在浏览器中打开索引.html时,节点控制台被用户连接的消息发送垃圾邮件。浏览器不是连接一个客户端,而是每秒发出数十个请求。当我关闭浏览器时,有一段时间没有输出,然后节点控制台被用户断开连接的消息发送垃圾邮件。

该服务器应该将通过POST发送的所有数据重定向到连接的套接字。当我发出这个POST请求时,节点服务器接收到它(我知道,因为它把它打印到节点控制台)。但是它不会被套接字客户端接收到,因为浏览器控制台中没有输出(但是浏览器仍然每秒钟建立几十个新连接。

这是怎么回事?首先,我以为我只是搞砸了,所以我回去复制粘贴了我找到的教程中的代码(不是英语,而是捷克语),但没有任何变化。本教程有很多积极的反馈,所以我的电脑可能有问题。但是什么?

共有3个答案

郭琦
2023-03-14

从不同于套接字的web服务器运行该页面的配置。io服务器处于打开状态时无法正常工作。要使其正常工作,需要三种变化之一:

>

  • 您可以通过从您的socket.io.的同一服务器加载网页来使用网页和socket.io连接的“同源”,这意味着您需要直接从socket.io的网络服务器加载网页。

    您可以配置套接字。io web服务器接受跨源连接(CORS连接)。

    您可以将socket.io客户端配置为使用webSocket直接连接,而无需使用常规的超文本传输协议请求进行socket.io通常的预览。

    如果您正在测试打算实际部署的内容,那么您也可以将现有的 socket.io Web服务器服务器设置为您的网页,并直接从中加载网页。

    出现此类情况的另一个可能原因是客户端和服务器版本的 socket.io 不兼容。您应该绝对确保在客户端和服务器上具有相同版本的 socket.io。如果从 socket.io Web 服务器从 /socket.io/socket.io.js 获取客户端 socket.io 库,则客户端版本将始终自动与服务器版本匹配。从 CDN 加载它的方式,您必须手动确保您具有相同的版本。

  • 长孙鸿
    2023-03-14

    因此,为了找出问题所在,我从socket.io网站下载了socket chat示例。当我运行它时,我经历了完全相同的错误行为——浏览器每秒钟打开许多套接字连接,而不是保持一个。

    所以我删除了node_modules文件夹,并使用npm再次安装这些模块,哇,它工作了。所以很可能文件只是在下载过程中被破坏了,但是这次做同样的程序是有效的。

    华宇
    2023-03-14

    我遇到了同样的问题,通过以下示例,客户端使用此 cdn 中的 socket.io 源:https://cdn.socket.io/socket.io-1.2.0.js

    每当我尝试运行该文件时,都会创建大量客户端(无论我是双击html文件,还是将其放在web服务器(如IIS)下)。然后我意识到它可能是一个旧版本,我只使用了从该源发布的最新版本:https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js

    现在一切都很好。希望这有帮助

     类似资料:
    • 我的api url: 我试图访问属性。我尝试了以下方法来访问它,但它返回错误: 因为工作,但现在弃用,我如何访问属性?

    • 问题内容: 我有以下查询,希望在单个选择请求中运行: 问题在于,所有内容都是通过单独的多个查询获取的。我只希望在单个请求中获取团队和团队的球员以及每个球员的技能。但是取而代之的是,我有多个选择查询来获取每个球队,每个球员,每个球员的统计数据和技能。 以下是带有给定注释的实体: 游戏实体: 团队实体: 玩家实体: 您能指出犯下的错误吗?我需要一个选择查询来加载游戏,它是团队,团队的球员和每个球员的技

    • 问题内容: 我有以下查询,希望在单个选择请求中运行: 问题在于,所有内容都是通过单独的多个查询获取的。我只希望在单个请求中获取团队和团队的球员以及每个球员的技能。但是取而代之的是,我有多个选择查询来获取每个球队,每个球员,每个球员的数据和技能。 以下是带有给定注释的实体: 游戏实体: 团队实体: 玩家实体: 您能指出犯下的错误吗?我需要一个选择查询来加载游戏,它是团队,团队的球员和每个球员的技能。

    • 问题内容: 我有一个javascript函数,其中有两个$ .post请求。两个$ .post请求都应该执行。但是有时候,第二个$ .post请求却没有执行。这可能是什么原因? 问题答案: 是$ .ajax()结构的缩写形式。我通常更喜欢使用该结构,因为: 比较容易发现我是否错过了任何事情 我可以更轻松地添加其他参数,例如 当刚接触ajax时,我发现对这种结构进行故障排除要容易得多 在您的情况下,

    • 出身背景 我将React Native中内置的应用程序连接到REST API。我通过Axios处理请求,并使用Redux存储查询结果。我有一个api连接的index.js文件,它保存了作为请求处理程序的函数,这些请求需要越来越深的授权级别。我有一个简单的函数返回访问令牌,这是由以下代码触发,当前位于应用程序的“欢迎页面”。 理想情况下,在浏览几个屏幕后,用户将进入主页并触发以下代码: 到目前为止,

    • 我已经设置了这组重写(Zend Framework默认重写规则): 我的文件夹只包含和,没有其他内容。 重写规则应通过index.php将所有请求发送到不存在的文件。这适用于(无论是否存在控制器),但不适用于或以开头的任何其他url。 所有URL都被路由到apache的404页面,所有其他URL都可以工作。 我该如何解决这个问题?