使用node.js + socket.io + redis實現基本的聊天室場景
在這篇文章Redis數據庫及其基本操做中介紹了Redis及redis-cli的基本操做. 其中的publish-subscribe機制應用比較普遍, 那麼接下來使用nodejs來實現該機制. 本文是對以前的一篇文章使用socket.io+redis來實現基本的聊天室應用場景的詳細補充.
關於redis的詳細狀況, 請參考Redis數據庫及其基本操做.
對於redis的前提是redis-server一直在運行, 這裏就使用默認的localhost:6379.javascriptnode.js鏈接redis-server
安裝redis模塊, 該模塊會默認安裝至當前目錄下的node_modules裏邊:html
npm install redis
- 1
而後鏈接redis, 並進行get-set操做java
var redis = require('redis'); var redisclient = redis.createClient(); redisclient.on('connect',function(){ redisclient.set('author', 'testauthor', redis.print); redisclient.get('author', redis.print); redisclient.get('hello', redis.print); });
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
執行結果:node
☁ socketio node redis_node.js Reply: OK Reply: testauthor Reply: world
- 1
- 2
- 3
- 4
node.js實現redis的publish-subscribe
代碼以下:redis
var redis = require('redis'); var redisclient = redis.createClient(); var sub = function(c) { var c = c || 'chatchannel'; redisclient.subscribe(c, function(e) { console.log('subscribe channel : ' + c); }); } sub(); redisclient.on('message', function(error, response) { console.log(response); })另外啓動了一個redis-cli的subscribe, 進行比較, 執行結果:
數據庫node.js啓動一個httpServer
var http = require('http'); // var server = http.createServer().listen(4000); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(4000); console.log('Server running at http://127.0.0.1:4000/');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
執行便可看到:
npmsocket.io在browser與server中同步數據
socket.io鏈接於browser和nodejs的http服務器之間,可用於兩者之間同步數據.
server端: 啓動httpserver監聽4000端口, 一旦有socket.io的鏈接創建, 則向socket發送msgReceived消息, 而消息內容是’hello’.服務器var server = require('http').createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(4000); console.log('Server running at http://127.0.0.1:4000/'); var io = require('socket.io')(server); io.on('connection', function(socket) { console.log('connection'); socket.emit('msgReceived', 'hello'); })
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
browser端:
創建socket鏈接, 而後接收socket上的msgReceived消息, 並顯示出來.socket<html> <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script> hello world <script type="text/javascript"> console.log("hello"); var socket = io('http://localhost:4000'); socket.on('connection', function() { console.log('connection setup for socket.io') }); socket.on('msgReceived', function(msg) { alert(msg); }) </script> </html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
爲了方便看到更好的效果, 將兩個browser都打開, 當httpserver未啓動時, browser中僅顯示 hello world. 一旦啓動httpserver: node testserver.js, 就能夠看到, 兩個browser都會自動彈出alert, 代表接收到了socket.io中的消息. 執行結果以下圖:
而後, 中止httpserver, 將發送msgReceived消息的內容更改成’world’, 兩個browser又再次彈出對應的alert. 以下圖:
這樣, 代表經過socket.io的鏈接, 使得httpserver與browser之間可以作到數據同步. 這裏就是, httpserver分別將hello和world傳遞給了browser.ui將subscribe的結果在browser中展現
接下來要作的是, 經過httpserver訂閱redis的chatchannel頻道, 將該頻道發佈的內容更新到browser中.
browser端不變, 而server端改成:var server = require('http').createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(4000); var redis = require('redis'); var redisclient = redis.createClient(); var sub = function(c) { var c = c || 'chatchannel'; redisclient.subscribe(c, function(e) { console.log('subscribe channel : ' + c); }); } sub(); console.log('Server running at http://127.0.0.1:4000/'); var io = require('socket.io')(server); io.on('connection', function(socket) { redisclient.on('message', function(error, msg) { console.log('connection'); console.log(msg); socket.emit('msgReceived', msg); }); })
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
首先redisclient訂閱redis-server的chatchannel頻道, 在socket.io鏈接創建時, 監聽redisclient的消息, 一旦接收到chatchannel頻道發佈的消息, 當即經過socket.io向全部創建鏈接的browser發送msgReceived消息, 內容是chatchannel頻道的發佈內容. 咱們這裏, 採用redis-cli來發布消息, 固然也能夠採用其餘方法.
執行結果以下:
首先, redis-cli並未發佈消息
而後, 發佈消息’how are you’, 兩個browser都會收到:
最後, 發佈消息’thank you, goodbye’, 兩個browser都會收到:
至此, 使用node.js和socket.io, 結合redis的publish-subscribe機制, 實現的聊天室場景就基本可行了.