socket.io 节点集群只有长轮询有效

socket.io with node cluster only long poll works

使用 socket.io 和 nodeJS 集群,看起来 Websocket 协议失败了,它回退到长轮询,知道为什么它不使用 websocket 吗?

这是控制台中唯一的错误

WebSocket connection to 'ws://localhost:5050/socket.io/?EIO=3&transport=websocket&sid=82qh7nBXGusxyelJAAAG' failed: Connection closed before receiving a handshake response

这是我的节点应用程序

if (cluster.isMaster) {
    // we create a HTTP server, but we do not use listen
    // that way, we have a socket.io server that doesn't accept connections
    var server = require('http').createServer();
    var io = require('socket.io').listen(server);
    var redis = require('socket.io-redis');
    var fs = require('fs');

    io.adapter(redis({host: '127.0.0.1', port: 6379}));
    var i = 0;
    setInterval(function () {
        // all workers will receive this in Redis, and emit
        io.sockets.in('EURUSD').emit('message', 'EURUSD ' + i++);
        io.sockets.in('GBPUSD').emit('message', 'GBPUSD ' + i++);
    }, 1000);

    for (var i = 0; i < os.cpus().length; i++) {
        cluster.fork();
    }
    cluster.on('online', function (worker) {
        console.log("New Worker with ID ", worker.id);
    });

    cluster.on('exit', function (worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
}

if (cluster.isWorker) {
    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);

    server.listen(config.port);

    var io = require('socket.io').listen(server);
    var redis = require('socket.io-redis');
    io.adapter(redis({host: '127.0.0.1', port: 6379}));


    io.sockets.on('connection', function (socket) {
        console.log('connected to worker id ', cluster.worker.id);
        socket.on('join', function (room) {
            socket.join(room);
        });

    });


    app.get("/", function (req, res) {
        res.sendFile('views/index.html', {root: __dirname});
    });
}

客户代码

  var socket = io();
    socket.on('message', function (data) {
        var item = $('<li>' + data + '</li>');
        $('ul').prepend(item);
    });

    socket.emit("join", "GBPUSD");

对于那些可能遇到类似问题的人,原来我有两次以下行

var io = require('socket.io')(server);

删除一个,问题解决了。