Node.Js+Redis+Socket.IO 实现 聊天室或推送消息
2017-09-05 08:48
941 查看
基于Redis 推送,向Node.Js 推送消息,Node.Js 把 消息推送給 Socket.IO(可以是WebSocket,也可以是long-Polling,由Socket.IO 封装)
需要 Redis服务端,Node.Js需要 redis模块和Socket.IO模块
Node.Js
var redisPusMsgServer = require('http').createServer().listen(1379);
var redis = require('redis'),
RDS_PORT = 6379, //端口号
RDS_HOST = '172.20.20.46', //服务器IP
RDS_OPTS = {}; //设置项
var redisclient = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS);//redis客户端
//创建redis 推送监听
var sub = function(x){
var x = "RedisTestChannel";
redisclient.select('15', function(error){
if(error) {
console.log(error);
} else {
redisclient.subscribe(x,function(e){
console.log('Subscribe Channel:' + x);
});
}
});
}
//执行redis 推送监听
sub();
//输出日志
console.log('redisPusMsgServer running at http://172.20.20.46:1379/');
//创建websocket服务
var io = require('socket.io')(redisPusMsgServer,{
"serveClient": false ,
"transports":['websocket', 'polling'] //这个配置可以 告诉socket.io 优先使用 哪个模式,默认是 polling,websocket
});
//websocket链接后,redis执行监听推送频道 是有消息
io.on('connection',function(socket){
//redis接收到推送消息后,websocket推送給页面
redisclient.on('message',function(error,msg){
console.log('connection');
console.log(msg);
//触发websocket 接收信息
socket.emit('msgReceived', msg);
});
//注册接收Web前端消息事件
socket.on('SendMsg', function(data) {
console.log('发送消息',data);
//socket.broadcast用于向整个网络广播(除自己之外)
socket.broadcast.emit('GetMsg',data);
});
//断开websocket事件
socket.on('disconnect', function(data) {
console.log('断开',data);
socket.emit('c_leave','离开');
//socket.broadcast用于向整个网络广播(除自己之外)
//socket.broadcast.emit('c_leave','某某人离开了')
});
});
HTML页面
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>socket</title>
<script type="text/javascript" src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script type="text/javascript" src="jquery-2.1.1.min.js"></script>
</head>
<body>
<div style="width:100px; height:200px; border:1px solid red" id="show"></div>
<button id="sendBtn">发送消息</button>
<button id="leaveBtn">离开</button>
</body>
<script type="text/javascript">
// 创建一个Socket实例
// var socket = new WebSocket('ws://localhost:9000');
// socket.onopen = function(event) {
// // 发送一个初始化消息
// socket.send('I am zqz_client!');
// // 监听消息
// socket.onmessage = function(event) {
// console.log('收到服务端消息: ', event);
// };
// // 监听Socket的关闭
// socket.onclose = function(event) {
// console.log('socket关闭: ', event);
// };
// // 关闭Socket....
// //socket.close()
// };
</script>
<script type="text/javascript">
var div = $("#show");
//这个配置可以 告诉socket.io 优先使用 哪个模式,默认是 polling,websocket
var socket=io.connect('ws://127.0.0.1:1379', {"transports":['websocket', 'polling']}),//与服务器进行连接
send=document.getElementById('sendBtn'),
leave=document.getElementById('leaveBtn');
send.onclick=function(){
socket.emit('hi', 'hello!');
}
leave.onclick=function(){
window.opener=null;window.close()
socket.emit('leave', 'leave');
}
//接收来自服务端的信息事件c_hi
socket.on('c_hi',function(msg){
alert(msg)
});
socket.on('msgReceived', function(msg) {
console.log('msgReceived',msg);
div.append(msg + "<br/>");
});
// socket.on('c_leave',function(msg){
// alert(msg)
// })
</script>
</html>
需要 Redis服务端,Node.Js需要 redis模块和Socket.IO模块
Node.Js
var redisPusMsgServer = require('http').createServer().listen(1379);
var redis = require('redis'),
RDS_PORT = 6379, //端口号
RDS_HOST = '172.20.20.46', //服务器IP
RDS_OPTS = {}; //设置项
var redisclient = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS);//redis客户端
//创建redis 推送监听
var sub = function(x){
var x = "RedisTestChannel";
redisclient.select('15', function(error){
if(error) {
console.log(error);
} else {
redisclient.subscribe(x,function(e){
console.log('Subscribe Channel:' + x);
});
}
});
}
//执行redis 推送监听
sub();
//输出日志
console.log('redisPusMsgServer running at http://172.20.20.46:1379/');
//创建websocket服务
var io = require('socket.io')(redisPusMsgServer,{
"serveClient": false ,
"transports":['websocket', 'polling'] //这个配置可以 告诉socket.io 优先使用 哪个模式,默认是 polling,websocket
});
//websocket链接后,redis执行监听推送频道 是有消息
io.on('connection',function(socket){
//redis接收到推送消息后,websocket推送給页面
redisclient.on('message',function(error,msg){
console.log('connection');
console.log(msg);
//触发websocket 接收信息
socket.emit('msgReceived', msg);
});
//注册接收Web前端消息事件
socket.on('SendMsg', function(data) {
console.log('发送消息',data);
//socket.broadcast用于向整个网络广播(除自己之外)
socket.broadcast.emit('GetMsg',data);
});
//断开websocket事件
socket.on('disconnect', function(data) {
console.log('断开',data);
socket.emit('c_leave','离开');
//socket.broadcast用于向整个网络广播(除自己之外)
//socket.broadcast.emit('c_leave','某某人离开了')
});
});
HTML页面
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>socket</title>
<script type="text/javascript" src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script type="text/javascript" src="jquery-2.1.1.min.js"></script>
</head>
<body>
<div style="width:100px; height:200px; border:1px solid red" id="show"></div>
<button id="sendBtn">发送消息</button>
<button id="leaveBtn">离开</button>
</body>
<script type="text/javascript">
// 创建一个Socket实例
// var socket = new WebSocket('ws://localhost:9000');
// socket.onopen = function(event) {
// // 发送一个初始化消息
// socket.send('I am zqz_client!');
// // 监听消息
// socket.onmessage = function(event) {
// console.log('收到服务端消息: ', event);
// };
// // 监听Socket的关闭
// socket.onclose = function(event) {
// console.log('socket关闭: ', event);
// };
// // 关闭Socket....
// //socket.close()
// };
</script>
<script type="text/javascript">
var div = $("#show");
//这个配置可以 告诉socket.io 优先使用 哪个模式,默认是 polling,websocket
var socket=io.connect('ws://127.0.0.1:1379', {"transports":['websocket', 'polling']}),//与服务器进行连接
send=document.getElementById('sendBtn'),
leave=document.getElementById('leaveBtn');
send.onclick=function(){
socket.emit('hi', 'hello!');
}
leave.onclick=function(){
window.opener=null;window.close()
socket.emit('leave', 'leave');
}
//接收来自服务端的信息事件c_hi
socket.on('c_hi',function(msg){
alert(msg)
});
socket.on('msgReceived', function(msg) {
console.log('msgReceived',msg);
div.append(msg + "<br/>");
});
// socket.on('c_leave',function(msg){
// alert(msg)
// })
</script>
</html>
相关文章推荐
- nodejs+socketio+redis实现前端消息实时推送
- nodejs+socketio+redis实现前端消息实时推送
- 使用node.js + socket.io + redis实现基本的聊天室场景
- 使用node.js + socket.io + redis实现基本的聊天室场景
- nodejs+socketio+redis 简单消息推送实例(一)
- NodeJS + Socket.IO 消息推送
- Node.js+Socket.IO实现的WebSocket群聊天室源码
- node.js+socket.io 实现一个web聊天室
- Spring Boot实战之netty-socketio实现简单聊天室(给指定用户推送消息)
- 用node.js(socket.io)实现数据实时推送
- 使用node.js和socket.io实现多人聊天室
- 用node.js(socket.io)实现数据实时推送
- node.js实现即时聊天室,使用模块(express+socket.io),附源码
- nodejs+express+websocket+redis实现消息订阅系统
- 使用node.js和socket.io实现多人聊天室
- 使用node.js和socket.io实现多人聊天室
- Spring Boot实战之netty-socketio实现简单聊天室(给指定用户推送消息)
- Node.js+Socket.IO实现的WebSocket群聊天室源码
- nodejs+socket.io实现数据推送功能
- Spring Boot实战之netty-socketio实现简单聊天室(给指定用户推送消息)