使用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机制, 实现的聊天室场景就基本可行了.

相关文章
相关标签/搜索