pomelo+mysql 学习(三)area场景服务器和connector服务器

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


待续。。。

猜你喜欢

转载自blog.csdn.net/gjyhit/article/details/80494915
今日推荐