没有使用这个基本的 socket.io + redis 设置接收事件?

Posted

技术标签:

【中文标题】没有使用这个基本的 socket.io + redis 设置接收事件?【英文标题】:not receiving events with this basic socket.io + redis setup? 【发布时间】:2016-11-14 21:43:31 【问题描述】:

我有一个使用socket.io-redis的简单socket.io服务器,一个socket.io-emitter,我运行redis(这对我来说是全新的,我在windows上,我下载了redis并打开了redis-server.exe 和 redis-cli.exe)。 通过使用命令monitor 的redis CLI,我看到服务器已连接并且事件从发射器到达redis,但test-server.js 从未记录任何内容。我还需要做什么? socket.io服务器需要订阅redis吗?

Redis 输出"publish" "socket.io#/#" "\x93\xa7emitter\x83\xa4type\x02\xa4data\x92\xa4test\xa9some data\xa3nsp\xa1/\x82\xa5rooms\x90\xa5flags\x80"

test-server.js

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

io.adapter(redis( host: '127.0.0.1', port: 6379 ));
io.on('connection', function(socket)
    console.log('client connected'); // Works
    socket.emit('connect','test'); // Works
);
io.on('test', function(socket)
    console.log('test came in'); // Works
);
server.listen(3000);

test-emit.js

var io = require('socket.io-emitter')(
    host:'localhost',
    port:'6379'
);
setInterval(function()
    io.emit('test', 'some data');
    console.log('emitted');
, 5000);

【问题讨论】:

【参考方案1】:

答案是 socket.io-emitter 不是我在这个测试用例中需要的。 它直接连接到redis。在下面的示例中,我现在使用通常的socket.io-client,所有事件都正确到达服务器,并且两个服务器和两个客户端都连接到不同的服务器,io.emit 两个客户端现在都收到了事件。太好了!

test-emit.js

var PORT = 3000;
var HOST = 'http://localhost';
var port = parseInt(process.argv[2]) || PORT;
var io = require('socket.io-client');
var socket = io.connect(HOST + ':' + port);

socket.on('connect', function () 
    console.log('connected, sending message');
    socket.emit('message', 'message from client');
    socket.on('message', function(data) 
        console.log('new message received: '+data);
    );
);

test-server.js

var port = parseInt(process.argv[2]) || 3000;
console.log('server listens on port ' + port);
var io = require('socket.io').listen(port);
var redis = require('socket.io-redis');
var adapter = redis( host: '127.0.0.1', port: 6379 );
io.adapter(adapter);
io.on('connection', function(socket)
    console.log('client connected');
    io.emit('message', 'client logged in on '+port+' and this message will be send to all clients');
    socket.on('message', function(d)
        console.log('message from socket:',d);
    );
);

启动 4 个不同的终端并运行:

$ node test-server 3000
$ node test-server 3001
$ node test-emit 3000
$ node test-emit 3001

【讨论】:

我也在使用 Redis 通过 socket.io-redis 提供消息。我的应用程序正在按预期工作。但是当我使用 redis-cli 检查 Redis dbs 中的数据时,我看不到任何消息。这是为什么呢?

以上是关于没有使用这个基本的 socket.io + redis 设置接收事件?的主要内容,如果未能解决你的问题,请参考以下文章

自定义 node-red-node socket.io 客户端建立连接但在收到数据时崩溃?

socket.io 发出多次

更改 Socket.IO 静态文件服务路径

我可以在 Django 中使用 Socket.IO 吗? [关闭]

AngularJS:通过 https 使用 socket.io 的聊天应用程序

使用 socket.io-client.java 库连接到 socket.io 命名空间