(轉載)使用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.

node.js連接redis-server

安裝redis模塊, 該模塊會默認安裝至當前目錄下的node_modules裡邊:

1 <code class="language-shell hljs cmake">npm install redis</code>

然後連接redis, 並進行get-set操作

12345678 <code class="language-node.js hljs php">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);});</code>

執行結果:

1234 <code class="language-shell hljs avrasm">? socketio node redis_node.jsReply: OKReply: testauthorReply: world</code>

node.js實現redis的publish-subscribe

代碼如下:

1234567891011121314 <code class="language-node.js hljs perl">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);})</code>

另外啟動了一個redis-cli的subscribe, 進行比較, 執行結果:

node.js啟動一個httpServer

123456789 <code class="language-node.js hljs javascript">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
"
);}).listen(4000);console.log("Server running at http://127.0.0.1:4000/");</code>

執行即可看到:

socket.io在browser與server中同步數據

socket.io連接於browser和nodejs的http伺服器之間,可用於二者之間同步數據.server端: 啟動httpserver監聽4000埠, 一旦有socket.io的連接建立, 則向socket發送msgReceived消息, 而消息內容是』hello』.

123456789101112 <code class="language-node.js hljs lua">var server = require("http").createServer(function (request, response) {response.writeHead(200, {"Content-Type": "text/plain"});response.end("Hello World
"
);}).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");})</code>

browser端:建立socket連接, 然後接收socket上的msgReceived消息, 並顯示出來.

1

<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>

為了方便看到更好的效果, 將兩個browser都打開, 當httpserver未啟動時, browser中僅顯示 hello world. 一旦啟動httpserver: node testserver.js, 就可以看到, 兩個browser都會自動彈出alert, 表明接收到了socket.io中的消息. 執行結果如下圖:

然後, 停止httpserver, 將發送msgReceived消息的內容更改為』world』, 兩個browser又再次彈出對應的alert. 如下圖:

vcr9vt3NrLK9LiDV4sDvvs3KxywgaHR0cHNlcnZlcrfWsfC9q2hlbGxvus13b3JsZLSrtd24+MHLYnJvd3Nlci48L3A+DQo8aDIgaWQ9"將subscribe的結果在browser中展示">將subscribe的結果在browser中展示

接下來要做的是, 通過httpserver訂閱redis的chatchannel頻道, 將該頻道發布的內容更新到browser中.browser端不變, 而server端改為:

1234567891011121314151617181920212223242526 <code class="language-node.js hljs javascript">var server = require("http").createServer(function (request, response) {response.writeHead(200, {"Content-Type": "text/plain"});response.end("Hello World
"
);}).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); });})</code>

首先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機制, 實現的聊天室場景就基本可行了.

推薦閱讀:

比較常見容易實現的醒酒食物
三種觀察者模式的C#實現
怎樣實現「房子是用來住的,不是用來炒的」?(嚴肅話題)
財商特訓營:怎樣才能 提早 實現財務自由?
四大區塊提前實現征遷戶100%簽約    錢江晚報

TAG:聊天 | 轉載 | 場景 | 聊天室 | 實現 |