写完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){}); };
待续。。。