用于node.js中聊天服务器的Redis pub / sub

时间:2011-09-18 19:02:52

标签: node.js redis socket.io

我正在尝试使用Redis Cookbook示例:

var http = require('http'),
io = require('socket.io')
fs = require('fs'),
redis = require('redis'),
rc = redis.createClient(9189, "pike.redistogo.com");
rc.auth("passwd", function() {
    console.log("Connected! to redistogo!");});

rc.on("connect", function() {
    rc.subscribe("chat");
    console.log("rc connect event");
});

我在这里取得了成功但从未得到“消息。”

rc.on("message", function (channel, message) {
 console.log("Sending: " + message);
 socketio.sockets.emit('message', message);
});

webpage = http.createServer(function(req, res){
console.log('webpage request starting...');

fs.readFile('./index.htm', function(error, content) {
    if (error) {
        res.writeHead(500);
        res.end();
    }
    else {
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.end(content, 'utf-8');
     }
 });
 });

 webpage.listen(7777);

我的客户端index.htm就是这个

<!docttype html>
<html lang="en">
<head>
    <script src ="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js">     </script>
       <script src="http://www.heaphash.com:7777/socket.io/socket.io.js"></script>
       <script>
        var socket = io.connect('www.heaphash.com', { port: 7777});
            socket.on('message', function(data){
               var li = new Element('li').insert(data);
               $('messages').insert({top: li});
           }
        </script>
        <meta charset="utf-8">
        <title>Chat with Redis</title>
 </head>
 <body>
        <ul id="messages">
            <!-- chat messages go here -->
        </ul>
        <form id="chatform" action="">
         <input id="chattext" type="text" value="" />
         <input type="submit" value="Send" />
        </form>
        <script>
                $('#chatform').submit(function(){
                        socket.emit('message', $('chattext').val());
                        $('chattext').val(""); //cleanup the field
                        return false;
                });
        </script>
</body>
</html>

客户如何发布到特定的Redis“聊天”频道。

2 个答案:

答案 0 :(得分:7)

如果您在node.js程序中使用redis pub / sub功能,则应该使用一个redis客户端连接来监听某些通道,使用第二个redis客户端连接来发送正常命令和/或向您的频道发布消息。来自node_redis docs:

  

当客户端发出SUBSCRIBE或PSUBSCRIBE时,将建立该连接   进入“pub / sub”模式。此时,只有修改的命令   订阅集有效。当订阅集为空时,   连接重新进入常规模式。

     

如果您需要在pub / sub模式下向Redis发送常规命令,   只是打开另一个连接。

您的问题也与这些问题有关:

答案 1 :(得分:1)

我相信那本书的例子遗漏了一些东西,我也读了那本书并想知道。您订阅了Redis频道,正在等待服务器端的消息,但您从未发布到该频道。缺少的是事件监听器,因此当有websocket消息时,您将该消息发布到redis通道。