使用node.js + socket.io + redis實現基本的聊天室場景

 

使用node.js + socket.io + redis實現基本的聊天室場景

 

在這篇文章Redis數據庫及其基本操做中介紹了Redis及redis-cli的基本操做. 其中的publish-subscribe機制應用比較普遍, 那麼接下來使用nodejs來實現該機制. 本文是對以前的一篇文章使用socket.io+redis來實現基本的聊天室應用場景的詳細補充. 
關於redis的詳細狀況, 請參考Redis數據庫及其基本操做
對於redis的前提是redis-server一直在運行, 這裏就使用默認的localhost:6379.javascript

node.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實現publish-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

執行便可看到: 
nodejs http servernpm

socket.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向socket發送消息
而後, 中止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並未發佈消息 
首先, redis-cli並未發佈消息
而後, 發佈消息’how are you’, 兩個browser都會收到: 
發佈消息'how are you'
最後, 發佈消息’thank you, goodbye’, 兩個browser都會收到: 
發佈消息'thank you, goodbye' 至此, 使用node.js和socket.io, 結合redis的publish-subscribe機制, 實現的聊天室場景就基本可行了.

相關文章
相關標籤/搜索