其实最开始要读pomelo框架无非是因为自己没有读过什么node.js框架的源码,不过后来就逐渐变成了想要知道pomelo框架是如何实现广播的,貌似这也是游戏服务器比较重要的功能吧。。。。
一开始会觉得这种广播在分布式的环境下实现会比较的复杂。。但是当搞明白了pomelo的实现之后,发现它是采用了一种折中的方法实现广播。。虽然没有刚开始自己想的那么牛逼,不过觉得也算是一种比较好的解决方案吧。。
那么接下来就用pomelo给的chat这个例子来分析吧,来看登录吧,首先会向gate服务器发起连接:
function queryEntry(uid, callback) {
var route = 'gate.gateHandler.queryEntry';
pomelo.init({
host: window.location.hostname,
port: 3014,
log: true
}, function() {
pomelo.request(route, { //发起请求,用于获取用于连接的connector服务器的地址
uid: uid
}, function(data) {
pomelo.disconnect();
if(data.code === 500) {
showError(LOGIN_ERROR);
return;
}
callback(data.host, data.port);
});
});
};
这部分代码主要要完成的目的就是与gate进行通信,gate会返回该客户用于连接的connector服务器的地址,我们来看看gate服务器是怎么生成这个地址的吧:
//next是一个函数,用于执行一些操作,将返回的数据发送回去
handler.queryEntry = function(msg, session, next) {
var uid = msg.uid;
if(!uid) {
next(null, {
code: 500
});
return;
}
// get all connectors
var connectors = this.app.getServersByType('connector'); //获取素有connector服务器的配置信息
if(!connectors || connectors.length === 0) {
next(null, { //第一个参error,第二个参数wie返回给客户端的信息
code: 500
});
return;
}
// select connector
var res = dispatcher.dispatch(uid, connectors); //选取一个connector服务器
next(null, {
code: 200,
host: res.host,
port: res.clientPort
});
};
var crc = require('crc');
module.exports.dispatch = function(uid, connectors) {
var index = Math.abs(crc.crc32(uid)) % connectors.length;
return connectors[index];
};
到这里就应该知道gate服务器是怎么挑选connector服务器的了吧。。。那么在获取了用于连接的connector之后,就应该建立与connector服务器的连接,进行登录了。。。代码如下:
//query entry of connection
queryEntry(username, function(host, port) {
pomelo.init({
host: host, //这里是返回的用于连接的connector服务器的host与port
port: port,
log: true
}, function() {
var route = "connector.entryHandler.enter"; //这里可以当做是进行登录吧
pomelo.request(route, {
username: username,
rid: rid
}, function(data) {
if(data.error) {
showError(DUPLICATE_ERROR);
return;
}
setName();
setRoom();
showChat();
initUserList(data);
});
});
});
可以看到这里调用的是connector服务器的handler的enter方法,然后传过去的参数是username和rid(房间的id),那么我们来看看这个connector服务器的enter方法干了些什么事情吧ÿ