233 lines
7.1 KiB
JavaScript
233 lines
7.1 KiB
JavaScript
/*
|
||
*介绍:socket.io 功能封装
|
||
*作者:TaiGuangYin
|
||
*时间:2017-09-09
|
||
* */
|
||
var redis = require('../utils/redis');
|
||
var msgType = require('./messageTpye');
|
||
var ioSvc = require('./ioHelper').ioSvc;
|
||
var AppConfig = require('../config');
|
||
|
||
//服务端连接
|
||
function ioServer(io) {
|
||
|
||
var _self = this;
|
||
ioSvc.setInstance(io);
|
||
|
||
//初始化连接人数
|
||
redis.set('online_count',0,null,function (err,ret) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
});
|
||
|
||
Array.prototype.remove = function(val) {
|
||
var index = this.indexOf(val);
|
||
if (index > -1) {
|
||
this.splice(index, 1);
|
||
}
|
||
};
|
||
|
||
io.on('connection', function (socket) {
|
||
console.log('SocketIO有新的连接!');
|
||
|
||
_self.updateOnlieCount(true);
|
||
|
||
//用户与Socket进行绑定
|
||
socket.on('login', function (uid) {
|
||
console.log(uid+'登录成功');
|
||
|
||
//通知用户上线
|
||
if(uid != AppConfig.KEFUUUID){
|
||
redis.get(AppConfig.KEFUUUID,function (err,sid) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
if(sid){
|
||
redis.get('online_count',function (err,val) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
if(!val){
|
||
val = 0;
|
||
}
|
||
if(typeof val == 'string'){
|
||
val = parseInt(val);
|
||
}
|
||
var info = {
|
||
"uid":uid,
|
||
"name":'客户'+val,
|
||
"type":'online'
|
||
};
|
||
io.to(sid).emit('update-users',info);
|
||
});
|
||
}
|
||
});
|
||
|
||
redis.get('user-uuids',function (err,uuids) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
if(uuids){
|
||
uuids =JSON.parse(uuids);
|
||
}else{
|
||
uuids = [];
|
||
}
|
||
if(uuids.indexOf(uid) == -1){
|
||
uuids.push(uid);
|
||
uuids = JSON.stringify(uuids);
|
||
redis.set('user-uuids',uuids,null,function (err,ret) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
});
|
||
}
|
||
});
|
||
|
||
}
|
||
|
||
redis.set(uid,socket.id,null,function (err,ret) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
});
|
||
|
||
redis.set(socket.id,uid,null,function (err,ret) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
});
|
||
|
||
});
|
||
|
||
//断开事件
|
||
socket.on('disconnect', function() {
|
||
console.log("与服务其断开");
|
||
|
||
_self.updateOnlieCount(false);
|
||
|
||
redis.get(socket.id,function (err,val) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
redis.del(socket.id,function (err,ret) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
|
||
});
|
||
redis.del(val,function (err,ret) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
});
|
||
//通知用户下线
|
||
if(val != AppConfig.KEFUUUID){
|
||
redis.get(AppConfig.KEFUUUID,function (err,sid) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
if(sid){
|
||
var info = {
|
||
"uid":val,
|
||
"name":'客户下线',
|
||
"type":'offline'
|
||
};
|
||
io.to(sid).emit('update-users',info);
|
||
}
|
||
});
|
||
|
||
redis.get('user-uuids',function (err,uuids) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
if(uuids){
|
||
uuids =JSON.parse(uuids);
|
||
}else{
|
||
uuids = [];
|
||
}
|
||
|
||
if(uuids.indexOf(val) != -1){
|
||
uuids.remove(val);
|
||
uuids = JSON.stringify(uuids);
|
||
redis.set('user-uuids',uuids,null,function (err,ret) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
});
|
||
});
|
||
|
||
//重连事件
|
||
socket.on('reconnect', function() {
|
||
console.log("重新连接到服务器");
|
||
});
|
||
|
||
//监听客户端发送的信息,实现消息转发到各个其他客户端
|
||
socket.on('message',function(msg){
|
||
if(msg.type == msgType.messageType.public){
|
||
var mg = {
|
||
"uid" : msg.from_uid ,
|
||
"content": msg.content
|
||
};
|
||
socket.broadcast.emit("message",mg);
|
||
}else if(msg.type == msgType.messageType.private){
|
||
var uid = msg.uid;
|
||
redis.get(uid,function (err,sid) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
if(sid){
|
||
//给指定的客户端发送消息
|
||
var mg = {
|
||
"uid" : msg.from_uid,
|
||
"content": msg.content
|
||
};
|
||
io.to(sid).emit('message',mg);
|
||
}
|
||
});
|
||
}
|
||
|
||
});
|
||
});
|
||
|
||
this.updateOnlieCount = function (isConnect) {
|
||
//记录在线客户连接数
|
||
redis.get('online_count',function (err,val) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
if(!val){
|
||
val = 0;
|
||
}
|
||
if(typeof val == 'string'){
|
||
val = parseInt(val);
|
||
}
|
||
if(isConnect){
|
||
val += 1;
|
||
}else{
|
||
val -= 1;
|
||
if(val<=0){
|
||
val = 0;
|
||
}
|
||
}
|
||
|
||
console.log('当前在线人数:'+val);
|
||
io.sockets.emit('update_online_count', { online_count: val });
|
||
|
||
redis.set('online_count',val,null,function (err,ret) {
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
});
|
||
});
|
||
};
|
||
|
||
}
|
||
|
||
|
||
//模块导出
|
||
exports.ioServer = ioServer; |