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

时间:2017-11-14 23:27:39

标签: javascript node.js sockets

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

enter image description here

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

的index.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>

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

server.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');
    });
});

当我运行服务器node server.js时,我收到了Server running at port 4000消息,一切似乎都很好。但是当我在浏览器中打开index.html时,节点控制台被a user connected消息发送垃圾邮件。浏览器不是每次连接一个客户端,而是每秒发出几十个请求。当我关闭浏览器时,一段时间内没有输出,然后节点控制台被user disconnected消息发送垃圾邮件。

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

这里有什么问题?首先我以为我搞砸了,所以我回去了tutorial I found的复制粘贴代码(不是英文,但是捷克语),但没有任何改变。本教程有很多积极的反馈,所以我的电脑可能有问题。但是什么?

3 个答案:

答案 0 :(得分:1)

为了找到确切的错误,我从socket.io网站下载了示例套接字聊天。当我运行它时,我遇到了完全相同的错误行为 - 浏览器每秒打开许多套接字连接而不是保留一个。

所以我删除了node_modules文件夹,并使用npm再次安装这些模块,哇,它的工作原理。所以这些文件在下载期间或者其他任何内容都已损坏,但是这次再次执行相同的程序。

答案 1 :(得分:1)

我遇到了同样的问题,通过以下客户端使用此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

现在一切正常。 希望这有帮助

答案 2 :(得分:0)

从与socket.io服务器打开的其他Web服务器运行该页面的配置将无法正常工作。它将需要三个更改之一才能使其正常工作:

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

  2. 您可以将socket.io Web服务器配置为接受跨源连接(CORS连接)。

  3. 您可以将socket.io客户端配置为使用webSocket直接连接,而无需使用常规http请求执行socket.io常规预览。

  4. 如果您正在测试您打算真实部署的内容,您可以将现有的socket.io Web服务器服务器作为您的网页并直接从该页面加载。

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