2011-09-18 11 views
9

Próbuję pracować przykład Redis Książka kucharska „komunikat”Redis pub/sub do serwera czatu w node.js

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"); 
}); 

jestem udany tędy ale nigdy nie

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); 

mój stronie klienta index.htm jest to

<!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> 

jaki sposób klient publikuje do konkretnego Redis "chat" kanał.

Odpowiedz

7

Jeśli używasz funkcji redis pub/sub w twoim programie node.js, powinieneś poświęcić jedno połączenie klienta redis do odsłuchania na pewnym kanale i drugie połączenie klienta redis do wysyłania normalnych poleceń i/lub publikowania wiadomości do twojego kanału (s). Od node_redis docs:

Gdy klient wystawia zapisać lub PSUBSCRIBE, że połączenie jest umieścić w trybie "pub/Sub". W tym momencie obowiązują tylko polecenia modyfikujące zestaw subskrypcji . Gdy zestaw subskrypcji jest pusty, połączenie zostaje przywrócone do zwykłego trybu.

Jeśli chcesz wysłać regularne polecenia do Redis w trybie Pub/Sub, wystarczy otworzyć inne połączenie.

Twój problem jest również związane z tymi pytaniami:

1

wierzę, że przykład z tej książki czegoś brakuje, ja też przeczytać tę książkę i zastanawiałem się. Subskrybujesz kanał Redis i czekasz na wiadomości po stronie serwera, ale nigdy nie publikujesz na tym kanale. To, czego brakuje, to detektor zdarzeń, więc gdy pojawi się komunikat websocket, publikuje się tę wiadomość na kanale redis.

Powiązane problemy