Відповіді:
використовує 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?