javascript - 为什么 socketIO 调用太多连接?

标签 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

如我所见,连接(请求)过多。 会发生什么?我的代码有什么问题?

最佳答案

您的客户端和服务器版本不匹配,导致初始连接失败,而旧的客户端愚蠢到只能一遍又一遍地尝试。如果您在服务器上使用 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 的服务器版本,客户端版本都会自动为您升级并保持完美同步,因为匹配的客户端版本内置于服务器版本。

关于javascript - 为什么 socketIO 调用太多连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47708284/

相关文章:

javascript - 是否可以处理 2 个变量以更改 if/else 条件在 ES6 上是否为真?

javascript - Meteor 辅助函数总是在 Meteor.startup() 之前被调用,并且被调用两次而不是一次

node.js - 为什么在 Node 中一定要使用 require 一步调用一个函数?

javascript - 服务器上的正确变量通过 socket.io 作为错误变量传递给客户端

javascript - 使用node.js require加载模块

javascript - 用于对数据进行分组的正则表达式

javascript - 根据 Vuex 状态有条件地渲染模态

javascript - 如何在标签(数据集)上触发点击事件并传递其值?

Angularjs 向服务器发送请求

javascript - 上传S3 knox node js(签名不匹配)