写完domain(逻辑代码)和auth(验证用户权限),下面开始写服务器的代码,服务器代码在/servers目录下, 通过规约的形式组织, 对外提供rpc接口, 处理客户端和服务端的请求并返回结果。进入game-server/app/servers。gate无需修改
在servers下新建area文件夹,在area下新建handler和remote文件夹,进入handler文件夹,新建userHandler
var area = require('../../../domain/area');
var handler = module.exports;
handler.getUserInfo = function(msg, session, next){
var user = area.getUser(session.uid);
console.log('user:', typeof(user), session.uid, area.users);
if(!user){
next(new Error('user not exist'));
return;
}
next(null, user.toJSON());
};
在remote文件夹下,新建userRemote.js
var logger = require('pomelo-logger').getLogger(__filename)
var area = require('../../../domain/area');
var userDao = require('../../../dao/userDao.js');
var User = require('../../../domain/user');
var remote = module.exports;
remote.userEnter = function(args, cb){
logger.debug('remote.userEnter:', args.uid);
getUser(args.uid, function(res){
logger.debug('getUser:',res);
if(res ===null){
cb(new Error('get user failed'));
return;
}
area.addUser(res);
cb(null);
});
};
remote.userLeave = function(args,cb){
logger.debug('remote.userLeave:',args.uid);
area.delUser(args.uid);
cb(null);
};
var getUser = function(uid, cb){
userDao.getUserByUserId(uid, function(err, res){
console.log('userDao.getUser:', res);
if(res ===null){
var user = new User({uid: uid});
userDao.createUser(user, function(err){
logger.info(err);
if(err===null){
cb(user);
}else{
cb(null);
}
});
}else{
cb(new User(res));
}
});
};
进入connector/handler/entryHandler.js
var Code = require('../../../../../shared/code');
var logger=require('pomelo-logger').getLogger(__filename);
var userDao = require('../../../dao/userDao');
var utils = require('../../../util/utils');
//node.js 的async模块
var async = require('async');
module.exports = function(app) {
return new Handler(app);
};
var Handler = function(app) {
this.app = app;
if(!this.app){
logger.error(app);
}
};
var handler = Handler.prototype;
/**
* New client entry game server. check token and bind user info into session
*
* @param {Object} msg request message
* @param {Object} session current session object
* @param {Function} next next stemp callback
* @return {Void}
*/
handler.enter = function(msg, session, next) {
console.log('connector enter:', msg);
var token = msg.token;
var self = this;
if(!token){
next(new Error('invalid enter request: token is empty'), {code:Code.FAIL});
return;
}
var uid;
async.waterfall([
function(cb){
//auth token
self.app.rpc.auth.authRemote.auth(session, token, cb);
},
function(id,cb){
if(id===null){
next(null,{code: Code.FAIL});
return;
}
uid = id;
self.app.get('sessionService').kick(uid,cb);
},
function(cb){
session.bind(uid,cb);
},
function(cb){
var areaServers= self.app.getServersByType('area');
if(!areaServers || areaServers.length ===0){
next(null,{code: Code.FAIL});
return;
}
var index = parseInt(Math.random()* areaServers.length,10);
var res = areaServers[index];
console.log('res.id:',res.id);
session.set('areaServerId',res.id);
session.on('closed',onUserLeave.bind(null,self.app));
session.pushAll(cb);
self.app.rpc.area.userRemote.userEnter(session,{'uid':uid},cb);
},
],function(err){
if(err){
next(err,{code:Code.FAIL});
return;
}
console.log('entry success!!!!');
next(null, {code: Code.OK});
});
};
/**
* User log out handler
*
* @param {Object} app current application
* @param {Object} session current session object
*
*/
var onUserLeave = function(app, session,reason) {
console.log('onUserLeave-reason:', reason);
if(!session || !session.uid) {
return;
}
console.log('onUserLeave:', session.uid);
utils.myPrint('1 ~ onUserLeave is running ...');
app.rpc.area.userRemote.userLeave(session,{uid:session.uid},function(err){});
};
待续。。。