Respuestas:
usa express , socket.io , node_redis y, por último, pero no menos importante, el código de muestra de media fire.
Primero debe (si aún no lo ha hecho) instalar node.js + npm en 30 segundos (de la manera correcta porque NO debe ejecutar npm como root ):
echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install # ok, fine, this step probably takes more than 30 seconds...
curl http://npmjs.org/install.sh | sh
Después de instalar node + npm, debe instalar las dependencias emitiendo:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Puede descargar una muestra completa de mediafire .
unzip pbsb.zip # can also do via graphical interface if you prefer.
./app.js
const PORT = 3000;
const HOST = 'localhost';
var express = require('express');
var app = module.exports = express.createServer();
app.use(express.staticProvider(__dirname + '/public'));
const redis = require('redis');
const client = redis.createClient();
const io = require('socket.io');
if (!module.parent) {
app.listen(PORT, HOST);
console.log("Express server listening on port %d", app.address().port)
const socket = io.listen(app);
socket.on('connection', function(client) {
const subscribe = redis.createClient();
subscribe.subscribe('pubsub'); // listen to messages from channel pubsub
subscribe.on("message", function(channel, message) {
client.send(message);
});
client.on('message', function(msg) {
});
client.on('disconnect', function() {
subscribe.quit();
});
});
}
./public/index.html
<html>
<head>
<title>PubSub</title>
<script src="/socket.io/socket.io.js"></script>
<script src="/javascripts/jquery-1.4.3.min.js"></script>
</head>
<body>
<div id="content"></div>
<script>
$(document).ready(function() {
var socket = new io.Socket('localhost', {port: 3000, rememberTransport: false/*, transports: ['xhr-polling']*/});
var content = $('#content');
socket.on('connect', function() {
});
socket.on('message', function(message){
content.prepend(message + '<br />');
}) ;
socket.on('disconnect', function() {
console.log('disconnected');
content.html("<b>Disconnected!</b>");
});
socket.connect();
});
</script>
</body>
</html>
cd pbsb
node app.js
Lo mejor es iniciar Google Chrome (debido a la compatibilidad con websockets, pero no es necesario). Visita http://localhost:3000
para ver una muestra (al principio no ves nada más PubSub
que un título).
Pero en el publish
canal pubsub
, debería ver un mensaje. A continuación publicamos "Hello world!"
en el navegador.
publish pubsub "Hello world!"
aquí hay un ejemplo simplificado sin tantas dependencias. Todavía necesitasnpm install hiredis redis
El nodo JavaScript:
var redis = require("redis"),
client = redis.createClient();
client.subscribe("pubsub");
client.on("message", function(channel, message){
console.log(channel + ": " + message);
});
... poner eso en un archivo pubsub.js y ejecutar node pubsub.js
en redis-cli:
redis> publish pubsub "Hello Wonky!"
(integer) 1
que debería mostrarse: pubsub: Hello Wonky!
en el nodo en ejecución del terminal! ¡Felicidades!
Adicional 23/4/2013: También quiero señalar que cuando un cliente se suscribe a un canal pub / sub, entra en modo de suscriptor y está limitado a los comandos de suscriptor. Solo necesitará crear instancias adicionales de clientes de redis. client1 = redis.createClient(), client2 = redis.createClient()
por lo que uno puede estar en modo de suscriptor y el otro puede emitir comandos DB regulares.
pubsub/*
agregar p
al ejemplo: reemplazar subscibe
con psubscribe
y message
con pmessage
.
Estábamos tratando de entender Redis Publish / Subscribe (" Pub / Sub ") y todos los ejemplos existentes estaban desactualizados, eran demasiado simples o no tenían pruebas. ¡Así que escribimos un chat en tiempo real completo usando Hapi.js + Socket.io + Redis Pub / Sub Example con pruebas de extremo a extremo !
El componente Pub / Sub tiene solo unas pocas líneas de código node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
En lugar de pegarlo aquí ( sin ningún contexto ), le recomendamos que consulte / pruebe el ejemplo .
Lo construimos usando Hapi.js pero el chat.js
archivo está desacoplado de Hapi y se puede usar fácilmente con un servidor http básico de node.js o express (etc.)
Maneje los errores de redis para evitar que nodejs salga. Puede hacerlo escribiendo;
subcribe.on("error", function(){
//Deal with error
})
Creo que obtiene la excepción porque está usando el mismo cliente que está suscrito para publicar mensajes. Cree un cliente separado para publicar mensajes y eso podría resolver su problema.
Consulte acani-node en GitHub , especialmente el archivo acani-node-server.js . Si estos enlaces están rotos, busque acani-chat-server entre los repositorios públicos de GitHub de acani .
Si desea que esto funcione con socket.io 0.7 Y un servidor web externo, debe cambiar (además del staticProvider -> problema estático):
a) proporcionar el nombre de dominio en lugar de localhost (es decir, var socket = io.connect ('http://my.domain.com:3000');) en el index.html
b) cambiar HOST en app.js (es decir, const HOST = 'my.domain.com';)
c) y agregue sockets en la línea 37 de app.js (es decir, 'socket.sockets.on (' conexión ', función (cliente) {…')
según la solución @alex . si tiene un error como este según la mención de @tyler :
node.js:134
throw e; // process.nextTick error, or 'error'
event on first tick ^ Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused at Socket.
entonces necesitas instalar Redis primero. mira esto:
const client = redis.createClient()
en la raíz de app.js?