Відповіді:
використовує express , socket.io , node_redis і не в останню чергу зразок коду від медіа-пожежі.
Спочатку слід (якщо ви цього ще не зробили) встановити node.js + npm за 30 секунд (правильний шлях, оскільки НЕ слід запускати npm як 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
Після встановлення вузла + npm слід встановити залежності, видавши:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Ви можете завантажити повний зразок з 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
Найкраще, якщо ви запустите Google Chrome (через підтримку веб-сокетів, але це не обов'язково). Відвідайте, http://localhost:3000щоб побачити зразок (на початку ви бачите не що інше, PubSubяк заголовок).
Але на publishканалі pubsubви повинні побачити повідомлення. Нижче ми публікуємо "Hello world!"в браузері.
publish pubsub "Hello world!"
ось спрощений приклад без такої кількості залежностей. Вам все одно потрібноnpm install hiredis redis
Вузол JavaScript:
var redis = require("redis"),
client = redis.createClient();
client.subscribe("pubsub");
client.on("message", function(channel, message){
console.log(channel + ": " + message);
});
... помістіть це у файл pubsub.js і запустіть node pubsub.js
в Redis-cli:
redis> publish pubsub "Hello Wonky!"
(integer) 1
який повинен відображатися: pubsub: Hello Wonky!у термінальному запущеному вузлі! Вітаю!
Додатково 23.04.2013: Я також хочу зауважити, що коли клієнт підписується на паб / підканал, він переходить у режим передплатників і обмежується командами передплатників. Вам просто потрібно буде створити додаткові екземпляри клієнтів Redis. client1 = redis.createClient(), client2 = redis.createClient()тому один може перебувати в режимі передплатників, а інший може видавати звичайні команди БД.
pubsub/*просто додати pв приклад: замінити subscibeна psubscribeі messageна pmessage.
Ми намагалися зрозуміти Redis Publish / Subscribe (" Pub / Sub "), і всі існуючі приклади були або застарілими, занадто простими, або не мали тестів. Отже, ми написали Повний чат у режимі реального часу, використовуючи Hapi.js + Socket.io + Redis Pub / Sub Приклад із тестами в кінці !
Компонент Pub / Sub - це лише кілька рядків коду node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Замість того, щоб вставляти його тут ( без будь-якого контексту ), ми рекомендуємо вам оформити замовлення / спробувати приклад .
Ми побудували його з допомогою Hapi.js , але chat.jsфайл від'єднано від Хапи і може легко використовуватися з базовим node.js HTTP - сервером або висловити ( і т.д.)
Обробіть помилки redis, щоб зупинити вихід вузлів. Це можна зробити, написавши;
subcribe.on("error", function(){
//Deal with error
})
Я думаю, ви отримуєте виняток, оскільки ви використовуєте того самого клієнта, який підписаний для публікації повідомлень. Створіть окремий клієнт для публікації повідомлень, який може вирішити вашу проблему.
Перевірте acani-вузол на GitHub , особливо файл acani-node-server.js . Якщо ці посилання розірвані, знайдіть acani-chat-сервер серед публічних сховищ GitHub Acani .
Якщо ви хочете, щоб це працювало з socket.io 0.7 І зовнішнім веб-сервером, вам потрібно змінити (окрім staticProvider -> статична проблема):
а) введіть доменне ім’я замість localhost (тобто var socket = io.connect ('http://my.domain.com:3000');) у index.html
b) зміни HOST у app.js (тобто const HOST = 'my.domain.com';)
в) і додайте сокети в рядок 37 програми app.js (тобто 'socket.sockets.on (' з'єднання ', функція (клієнт) {…')
згідно з рішенням @alex . якщо у вас є така помилка, як зазначено у @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.
тоді вам потрібно спочатку встановити Redis . заціни:
const client = redis.createClient()в корені app.js?