为什么socketIO调用太多连接?

时间:2017-12-08 05:30:39

标签: javascript node.js socket.io

我用Express,SocketIO和Redis创建了我的Socket服务器

server.js

var app    = require('express')();
var server = require('http').Server(app);
var io     = require('socket.io')(server);
var redis  = require('redis');

server.listen(8890, function (e) {
    console.log(e);
});
io.on('connection', function (socket) {
    console.log("new client connected");
    var redisClient = redis.createClient();
    redisClient.subscribe('message');

    redisClient.on("message", function(channel, message) {
        console.log("mew message in queue "+ message + "channel");
        socket.emit(channel, message);
    });

    socket.on('disconnect', function() {
        redisClient.quit();
    });

    socket.on('connect_error', function() {
        redisClient.quit();
    });
});

从命令行,我运行node server.js。它奏效了。

我还创建了一个html文件来连接到该服务器。 在浏览器控制台中,我运行io.connect('http://localhost:8890')。结果我得到了 enter image description here

正如我所见,连接(请求)太多。 怎么了?我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

您的客户端和服务器版本不匹配导致初始连接失败,而较旧的客户端非常愚蠢,无法继续尝试。如果您在服务器上使用2.0.4,那么您也必须将该版本用于客户端。如果您使用以下命令直接从服务器提供客户端版本:

<script src="http://localhost:8890/socket.io/socket.io.js"></script>

然后,socket.io服务器将自动为您提供正确的客户端版本。

或者,您可以手动链接到CDN上的正确版本,例如https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js。但客户端和服务器版本必须匹配。

直接从您自己的服务器获取客户端的优点是,无论何时更新服务器版本的socket.io,客户端版本都将自动升级并保持完美同步,因为匹配的客户端版本内置于服务器版本。