问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

pomelo广播包过大导致卡住怎么解决

发布网友 发布时间:2022-04-12 22:20

我来回答

2个回答

懂视网 时间:2022-04-13 02:41

一、pomelo在GitHub上各个项目间的关系 1、pomelo项目 pomelo项目是一个 游戏服务器框架 ,用它可以创建 服务器端项目 。 2、chatofpomelo-websocket项目 chatofpomelo-websocket项目是由pomelo服务器框架创建的一个服务器端项目。这个项目与pomelo-cocos2dc

一、pomelo在GitHub上各个项目间的关系

1、pomelo项目

pomelo项目是一个游戏服务器框架,用它可以创建服务器端项目。


2、chatofpomelo-websocket项目

chatofpomelo-websocket项目是由pomelo服务器框架创建的一个服务器端项目。这个项目与pomelo-cocos2dchat项目一同实现了一个简单的聊天室功能。


3、pomelo-cocos2dchat项目

这个项目是一个由Cocos2d-x游戏引擎创建的客户端项目。这个项目与chatofpomelo-websocket项目是相匹配的客户端与服务端。


4、libpomelo项目

这个项目其实是一个第三方库,Cocos2d-x的项目要与基于pomelo的服务器通信,就需要这个第三方库的支持。


二、移动网络游戏的实现流程

移动网络游戏实现流程图


一个移动网络游戏由客户端与服务器端两个部分组成,客户端与服务器端可以通过例如websocket接口进行通信。

Cocos2d-x引擎提供创建Cocos2d-x项目的模板,为新建项目添加必要的库文件后,对项目进行代码实现即可得到游戏的客户端程序。

服务器端程序亦是如此,pomelo框架提供pomelo项目的模板,新建pomelo项目后进行代码实现就可以完成服务器端。启动服务器端之后再启动客户端即可实现游戏的运行。


pomelo 与 Cocos2d-JS 开发环境搭建

Mac下将libpomelo连接到Cocos2d-x的解决方案

Cocos2d-js v3.0-rc0 下 pomelo-cocos2d-jsb native web 配置

手把手教你把pomelo客户端组件libpomelo加入Cocos2d-x 3.0项目(Windows、Android、iOS平台)


来源网址:http://www.cnblogs.com/tangyikejun/p/3981042.html

热心网友 时间:2022-04-12 23:49

其实最开始要读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');

mole.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方法干了些什么事情吧:

handler.enter = function(msg, session, next) {
var self = this;
var rid = msg.rid;
var uid = msg.username + '*' + rid //用户名字还要加上组名字
var sessionService = self.app.get('sessionService');

//plicate log in
if( !! sessionService.getByUid(uid)) { //表示有相同的用户了
next(null, {
code: 500,
error: true
});
return;
}

session.bind(uid); //将这个session与uid绑定起来
session.set('rid', rid);
session.push('rid', function(err) {
if(err) {
console.error('set rid for session service failed! error is : %j', err.stack);
}
});
session.on('closed', onUserLeave.bind(null, self.app)); //设置closed事件的处理函数

//put user into channel
//这里session适用于挑选后台的chat服务器的,这里还要讲当前frontend服务器的serverID传送过去,因为后台要知道当前channel的用户都在哪些frontend服务器上面连接着
//这里挑选后台的chat服务器的时候,用的是rid,所以可以保证同一个房间的人分到同一个chatserver
self.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){
next(null, {
users:users //远程服务器返回的当前channel里面的所有的用户
});
});
};
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
初中英语语法讲解:名词所有格 关于名词所有格一问 暗区突围画面怎么设置最好-暗区突围画面设置推荐 暗区突围打开的箱子怎么关上 保险箱关闭攻略 暗区突围 暗区突围画面设置怎么弄最佳? 暗区突围 暗区突围光影怎么调? 暗区突围 暗区突围中间白点怎么设置? 暗区突围灵敏度怎么调最稳 暗区突围灵敏度最佳设置方法 我的WIN7 64位系统无法安装打印机HP1136,请支持啊,急。驱动下载也没用... win7电脑连接不上惠普打印机Win7系统安装不了惠普HP1007打印机 如何删除Redis列表中的所有条目 我昨天晚上梦见了2到3个花棺材,不知道是什么意思!请问那位高人可以解答!(我是个女人) 绿山咖啡和蓝山咖啡那个贵 请问下大家知道excel中如何计算标准差? 真的很急了,我先谢谢各位了 请问excel中如何计算标准差?谁知道 告诉我吧,真心谢谢大家了3j 如何用excel求标准差 QQ密码保护个人信息怎么才能修改? QQ密码修改保护资料 电流电压电阻怎么理解???有没有形象的比喻?? 怎样认识电阻, 深圳市泽峻精密五金有限公司怎么样? 松田精密五金(深圳)有限公司怎么样? 14.1怎样认识电阻1 深圳市德美斯精密工业有限公司怎么样? 请问电阻的阻值是怎么看的 谁能教我怎么看电阻,怎样计算它的阻值 深圳市雷奥精密五金工具有限公司怎么样? 深圳市德易兴精密工业有限公司怎么样? 怎么认识电阻大小 深圳市海立德精密机械有限公司怎么样? 如何通过正则匹配删除Redis里的键 引起龋齿的原因有哪些 安迪的处事原则是怎么样的,你学会了吗? logstash中怎么删除redis中过期数据 临夏那里有买蓝山咖啡 龋齿的原因? 欢乐颂杨紫被扇耳光是第几集 邱莹莹和白主管结局在一起了吗 欢乐颂曲筱绡为了再见赵医生打肿了是几集 做梦梦见2个金棺材,一个上面上面绑红花是什么意思 现在大部分孩子都有龋齿,是什么原因造成的? 显示器调亮一些好还是调暗一些好? 显示器的亮度调暗些好还是亮些好? 电脑显示器是越亮越好,还是暗点好? 调电脑显示屏亮度亮还是暗一些好 电脑显示器亮度亮一点还是暗一点对眼睛比较好! 电脑液晶屏幕的亮度是亮点好还是暗点好? 电脑显示屏亮度越暗越好吗 西安仁昌物流有限公司怎么样? 对眼睛来说,电脑显示器的亮度是亮些好还是暗些好? 选择快递公司需要注意什么