Socket.io和Redis Pub/Sub无法工作

3

大家好,我希望能找出我的代码中的错误。我的代码涉及socket.io和redis pub/sub,这是我第一次尝试,希望你们能帮助我。

这是我的index.html文件。

<!doctype html>
<html>
    <script src="/socket.io/socket.io.js"></script>
    <script> 
        var socket = new io.Socket();
        socket.connect();

        socket.on('connection', function (socket) {
            console.log('Connected');
        });

        socket.on('disconnect', function (socket) {
            console.log('Disconnected');
        });
    </script>
    <center>
    <h1>Test Page</h1>
    </center>
</html>

这是我的 app.js 文件。
var redis = require('redis');
var app = require('http').createServer();
var io = require('socket.io').listen(app);
var client = redis.createClient();
var pub = redis.createClient();
var sub = redis.createClient();

app.listen(1234);

io.sockets.on('connection', function (socket){
    sub.on('subscribe', function (channel){
        pub.publish('Pub','Test Message 1');
        pub.publish('Pub','Test Message 2');
        pub.publish('Pub','Test Message 3');
    });
    sub.on('message', function (channel, message) {
        console.log(channel + ':' + message);
    sub.unsubscribe();
    pub.end();
    sub.end();
    });
    sub.incr('Channel Test');
    sub.incr('Pub');
});

我希望你能帮助我修复这段代码。谢谢大家提前。

2个回答

3
我可以看到你的代码中有许多错误:
  • 在index.html中,你应该连接到http://localhost:1234/,因为它在你的服务器代码中定义了。
  • var client没有在app.js中使用。
  • sub从未订阅过任何内容。你需要订阅一个频道。
  • subscriber mode的连接不能向redis发送命令:只有修改订阅集合的命令是有效的。
  • sub.incr永远不会发布消息:你必须调用publish。
  • 不要调用pub.end()sub.end(),因为连接将被关闭。
  • 不要在连接事件下添加处理程序到message事件:会导致内存泄漏。

我不知道你想做什么,但这里是更新后的版本:

index.html

<!doctype html>
<html>
    <script src="http://localhost:1234/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://localhost:1234/');

        socket.on('connection', function (socket) {
            console.log('Connected');
        });

        socket.on('disconnect', function (socket) {
            console.log('Disconnected');
        });
    </script>
    <center>
    <h1>Test Page</h1>
    </center>
</html>

app.js

var redis = require('redis');
var app = require('http').createServer();
var io = require('socket.io').listen(app);
var pub = redis.createClient();
var sub = redis.createClient();

app.listen(1234);

sub.subscribe('Pub');//subscribe to Pub channel
sub.on('message', function (channel, message) {
    console.log(channel + ':' + message);
});

io.sockets.on('connection', function (socket) {
    pub.publish('Pub', 'New Connection');
    pub.incr('Channel Test');   //increment 'Channel Test' but do not publish messages
    pub.incr('Pub');            //increment 'Pub' but do not publish messages
});

1
我没有看到你在socket.io服务器中设置redis作为存储。这里有一些例子供您参考:
// start up express server along with socket.io
var express = require('express');
var server = express();
var socket = require('socket.io');
var io = socket.listen(server);

// socket.io
io.set('store', new socket.RedisStore);

// set-up connections...
io.sockets.on('connection', function(socket) {

        io.emit('an event sent to all connected clients');

        socket.on('some-event', function(rooms) {
            ...
        });

});

您可以在下面读取文档链接:

  1. 配置 Socket.IO
  2. socket.io GitHub 网站

我认为问题不在于如何配置存储。 - Cybermaxs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接