【问题标题】:Socket.io and Redis Pub/Sub not workingSocket.io 和 Redis Pub/Sub 不工作
【发布时间】:2013-09-11 02:29:15
【问题描述】:

大家好,我想弄清楚我的代码中的错误是什么,我的代码是关于 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');
});

希望您能帮我修复此代码。在此先感谢各位。

【问题讨论】:

    标签: javascript node.js redis socket.io publish-subscribe


    【解决方案1】:

    我可以在您的代码中看到很多错误:

    • 在 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
    });
    

    【讨论】:

      【解决方案2】:

      我没有看到你将 redis 设置为 socket.io 服务器中的存储。我做的一些例子供你参考:

      // 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. Configuring Socket.IO
      2. socket.io github site

      【讨论】:

      • 我认为问题不在于如何配置商店
      猜你喜欢
      • 2012-04-27
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2011-10-17
      • 1970-01-01
      • 2015-11-09
      相关资源
      最近更新 更多