Jawaban:
menggunakan express , socket.io , node_redis dan yang terakhir tetapi tidak kalah pentingnya kode sampel dari api media.
Pertama Anda harus (jika Anda belum melakukannya) menginstal node.js + npm dalam 30 detik (cara yang benar karena Anda TIDAK harus menjalankan npm sebagai 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
Setelah Anda menginstal node + npm, Anda harus menginstal dependensi dengan menerbitkan:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Anda dapat mengunduh sampel lengkap dari 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
Paling baik jika Anda memulai google chrome (karena dukungan websockets, tetapi tidak perlu). Kunjungi http://localhost:3000
untuk melihat sampel (pada awalnya Anda tidak melihat apa pun kecualiPubSub
sebagai judul).
Tapi di publish
saluran pubsub
Anda akan melihat pesan. Di bawah ini kami publikasikan "Hello world!"
ke browser.
publish pubsub "Hello world!"
berikut adalah contoh sederhana tanpa banyak ketergantungan. Anda masih perlu melakukannyanpm install hiredis redis
Node JavaScript:
var redis = require("redis"),
client = redis.createClient();
client.subscribe("pubsub");
client.on("message", function(channel, message){
console.log(channel + ": " + message);
});
... taruh itu di file pubsub.js dan jalankan node pubsub.js
di redis-cli:
redis> publish pubsub "Hello Wonky!"
(integer) 1
yang seharusnya menampilkan: pubsub: Hello Wonky!
di terminal yang menjalankan node! Selamat!
Tambahan 4/23/2013: Saya juga ingin mencatat bahwa ketika klien berlangganan ke saluran pub / sub, ia masuk ke mode pelanggan dan terbatas pada perintah pelanggan. Anda hanya perlu membuat instance tambahan dari klien redis. client1 = redis.createClient(), client2 = redis.createClient()
jadi satu bisa dalam mode pelanggan dan yang lain bisa mengeluarkan perintah DB biasa.
pubsub/*
hanya menambahkan p
ke contoh: ganti subscibe
dengan psubscribe
dan message
dengan pmessage
.
Kami mencoba memahami Redis Publish / Subscribe (" Pub / Sub ") dan semua contoh yang ada sudah usang, terlalu sederhana atau tidak memiliki pengujian. Jadi kami menulis Obrolan Waktu Nyata Lengkap menggunakan Hapi.js + Socket.io + Contoh Redis Pub / Sub dengan Tes End-to-End !
Komponen Pub / Sub hanya beberapa baris kode node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Daripada menempelkannya di sini ( tanpa konteks apa pun ), kami mendorong Anda untuk membayar / mencoba contoh .
Kami membangunnya menggunakan Hapi.js tetapi chat.js
file de-ditambah dari Hapi dan dapat dengan mudah digunakan dengan dasar server yang node.js http atau mengungkapkan (dll)
Tangani error redis untuk menghentikan nodej agar tidak keluar. Anda dapat melakukannya dengan menulis;
subcribe.on("error", function(){
//Deal with error
})
Saya rasa Anda mendapatkan pengecualian karena Anda menggunakan klien yang sama yang berlangganan untuk menerbitkan pesan. Buat klien terpisah untuk menerbitkan pesan dan itu bisa menyelesaikan masalah Anda.
Lihat acani-node di GitHub , terutama file acani-node-server.js . Jika tautan ini rusak, cari acani-chat-server di antara repositori publik GitHub acani .
Jika Anda ingin membuatnya berfungsi dengan socket.io 0.7 DAN server web eksternal, Anda perlu mengubah (selain staticProvider -> masalah statis):
a) berikan nama domain sebagai ganti localhost (yaitu var socket = io.connect ('http://my.domain.com:3000');) di index.html
b) ubah HOST di app.js (yaitu, const HOST = 'domainku.com';)
c) dan tambahkan soket di baris 37 app.js (yaitu 'socket.sockets.on (' connection ', function (client) {…')
menurut solusi @alex . jika Anda memiliki kesalahan seperti ini sesuai @tyler menyebutkan:
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.
maka Anda perlu menginstal Redis terlebih dahulu. lihat ini:
const client = redis.createClient()
di root app.js?