Antworten:
verwendet express , socket.io , node_redis und nicht zuletzt den Beispielcode von media fire.
Zuerst sollten Sie (falls Sie dies noch nicht getan haben) node.js + npm in 30 Sekunden installieren (der richtige Weg, da Sie npm NICHT als root ausführen sollten ):
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
Nachdem Sie node + npm installiert haben, sollten Sie Abhängigkeiten installieren, indem Sie Folgendes ausgeben:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Sie können das vollständige Beispiel von mediafire herunterladen .
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
Am besten, wenn Sie Google Chrome starten (wegen der Unterstützung von Websockets, aber nicht erforderlich). Besuchen Sie http://localhost:3000
, um das Beispiel zu sehen (am Anfang sehen Sie nichts anderes PubSub
als den Titel).
Aber auf publish
Kanal pubsub
sollten Sie eine Nachricht sehen. Unten veröffentlichen wir "Hello world!"
im Browser.
publish pubsub "Hello world!"
Hier ist ein vereinfachtes Beispiel ohne so viele Abhängigkeiten. Sie müssen nochnpm install hiredis redis
Der Knoten JavaScript:
var redis = require("redis"),
client = redis.createClient();
client.subscribe("pubsub");
client.on("message", function(channel, message){
console.log(channel + ": " + message);
});
... das in eine pubsub.js Datei legen und ausführen node pubsub.js
in redis-cli:
redis> publish pubsub "Hello Wonky!"
(integer) 1
was angezeigt werden sollte: pubsub: Hello Wonky!
im Terminal läuft Knoten! Glückwunsch!
Zusätzliches 23.04.2013: Ich möchte auch darauf hinweisen, dass ein Client, der einen Pub / Sub-Kanal abonniert, in den Abonnentenmodus wechselt und auf Abonnentenbefehle beschränkt ist. Sie müssen nur zusätzliche Instanzen von Redis-Clients erstellen. client1 = redis.createClient(), client2 = redis.createClient()
So kann sich einer im Abonnentenmodus befinden und der andere kann reguläre DB-Befehle ausgeben.
pubsub/*
nur p
das Beispiel zu ergänzen : Ersetzen subscibe
durch psubscribe
und message
durch pmessage
.
Wir haben versucht, Redis Publish / Subscribe (" Pub / Sub ") zu verstehen, und alle vorhandenen Beispiele waren entweder veraltet, zu einfach oder hatten keine Tests. Also haben wir einen vollständigen Echtzeit-Chat mit Hapi.js + Socket.io + Redis Pub / Sub-Beispiel mit End-to-End-Tests geschrieben !
Die Pub / Sub-Komponente besteht nur aus wenigen Zeilen des node.js-Codes: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Anstatt es hier ( ohne Kontext ) einzufügen , empfehlen wir Ihnen, das Beispiel zu überprüfen / auszuprobieren .
Wir bauten es mit Hapi.js aber die chat.js
Datei ist entkoppelten von Hapi und kann leicht mit einem verwendet werden grundlegende node.js HTTP - Server oder Express (etc.)
Behandeln Sie Redis-Fehler, um das Beenden von NodeJS zu verhindern. Sie können dies durch Schreiben tun;
subcribe.on("error", function(){
//Deal with error
})
Ich denke, Sie erhalten die Ausnahme, weil Sie denselben Client verwenden, der zum Veröffentlichen von Nachrichten abonniert ist. Erstellen Sie einen separaten Client zum Veröffentlichen von Nachrichten, um Ihr Problem zu lösen.
Schauen Sie sich acani-node auf GitHub an , insbesondere die Datei acani-node-server.js . Wenn diese Links nicht mehr funktionieren, suchen Sie in den öffentlichen GitHub-Repositories von acani nach einem acani-Chat-Server .
Wenn Sie dies mit socket.io 0.7 UND einem externen Webserver zum Laufen bringen möchten, müssen Sie dies ändern (neben dem staticProvider -> static-Problem):
a) Geben Sie den Domainnamen anstelle von localhost (dh var socket = io.connect ('http://my.domain.com:3000');) in der index.html an
b) Ändern Sie HOST in app.js (dh const HOST = 'my.domain.com';)
c) und fügen Sie Sockets in Zeile 37 von app.js hinzu (dh 'socket.sockets.on (' Verbindung ', Funktion (Client) {…')
gemäß @alex Lösung. Wenn Sie einen Fehler wie diesen gemäß @tyler haben, erwähnen Sie:
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.
Dann müssen Sie zuerst Redis installieren . Schau dir das an:
const client = redis.createClient()
im Stammverzeichnis von app.js?