pomelo 源码结构

王朝娱乐H5 游戏源码(cocos creator , pomelo + mongDB)搭建教程 1. 安装nodejs NodeJS 与 npm 在Windows下版本升级 npm -g install npm@8.15.1 nvm install v8.15.1 1. sudo yum -y install gcc gcc-c++ openssl-devel (安装相关软件) 2. 下载nodejs源码包并解压 wget https://nodejs.org/dist/v8.15.1/node-v8.15.1.tar.gz tar zx... 阅读详情

源码在github上面,通过如下命令,获得:

$ git clone https://github.com/NetEase/chatofpomelo-websocket.git
$ git checkout tutorial-starter

这个是很简单的应用,其代码结构如下图:

源码结构图

game-server

game-server目录放的是所有游戏服务器的逻辑,以文件app.js作为入口,运行游戏的所有逻辑和功能。从图上可以看出其servers里面有三个目录,分别是gate,connector,chat。在pomelo中,使用路径来区分服务器类型,因此三个目录代表了三种不同类型的服务器,每一个目录下面可以定义handler,remote,定义了handler和remote就决定了这个服务器的行为。

  • 对于gate服务器,其逻辑实现代码在其gateHandler.js中,它接受客户端查询connector的请求,返回给客户端一个可以连接的connector的(ip,port);

  • connector服务器,其逻辑代码在entryHandler.js中,它主要完成接受客户端的请求,维护与客户端的连接,路由客户端的请求到chat服务器;

  • chat服务器,其既有handler代码,也有remote代码, handler中处理用户的send请求,而remote是当有用户加入或者退出的时候,由connector来发起远程调用时调用的。在remote里由于涉及到用户的加入和退出,所以会有对channel的操作。

game-server 的子目录config下面是游戏服务器所用到的配置文件存放的地方,配置信息使用JSON格式,包含有日志,master服务器和其他服务器的配置信息。除了这个pomleo所需的配置信息外,一般情况下,也将游戏逻辑所需要的配置信息放到这个目录下,例如数据库的配置信息,地图信息等。

logs子目录下存放游戏服务器产生的所有的日志信息。

web-server

由于我们这个聊天应用的客户端是web,所以需要一个web服务器。在这个目录下,主要是客户端的js,css和静态资源等等。在本例子中,里面有用户登录,聊天的逻辑的js文件等等。我们在这个例子教程中,更多地关注的是服务器端的逻辑以及功能,对于客户端,我们几乎不需要怎么修改其代码,直接使用默认就好。

安装及运行

首先,确保你已经成功安装了pomelo。执行命令安装依赖:

$ sh npm-install.sh

启动游戏服务器:

$ cd game-server
$ pomelo start

启动web服务器:

$ cd web-server
$ node app.js

如果启动过程中没有问题的话,下面我们就可以使用我们的聊天服务了,打开浏览器,输入http://127.0.0.1:3001/index.html, 输入一个用户名和一个房间名,就可以加入到聊天中了。可以多开几个客户端实例,测试chat是否能正常地运行,可以在一个房间里广播,也可以单个给某一个人发消息,效果图如下:

chat

chat分析

我们要搭建的pomelo聊天室具有如下的运行架构:

multi chat

在这个架构里,前端服务器也就是connector专门负责承载连接, 后端的聊天服务器则是处理具体逻辑的地方。 这样扩展的运行架构具有如下优势:

  • 负载分离:这种架构将承载连接的逻辑与后端的业务处理逻辑完全分离,这样做是非常必要的, 尤其是广播密集型应用(例如游戏和聊天)。密集的广播与网络通讯会占掉大量的资源,经过分离后业务逻辑的处理能力就不再受广播的影响。

  • 切换简便:因为有了前、后端两层的架构,用户可以任意切换频道或房间都不需要重连前端的websocket。

  • 扩展性好:用户数的扩展可以通过增加connector进程的数量来支撑。频道的扩展可以通过哈希分区等算法负载均衡到多台聊天服务器上。理论上这个架构可以实现频道和用户的无限扩展。

客户端

聊天室的逻辑包括以下几个部分:

  • 用户进入聊天室:这部分逻辑负责把用户信息注册到session,并让用户加入聊天室的channel。
  • 用户发起聊天: 这部分包括了用户从客户端发起请求,服务端接收请求等功能。
  • 广播用户的聊天: 所有在同一个聊天室的客户端收到请求并显示聊天内容。
  • 用户退出: 这部分需要做一些清理工作,包括session和channel的清理。

客户端首先要给gate服务器查询一个connector服务器,gate给其回复一个connector的地址及端口号,这里没有列出完整的代码,具体的代码在路径web-server/public/js/client.js中,详细代码略去,见client.js:

function queryEntry(uid, callback) {
  var route = 'gate.gateHandler.queryEntry';
  // ...
}

$("#login").click(function() {
  username = $("#loginUser").attr("value");
  rid = $('#channelList').val();

  // ...

 //query entry of connection
  queryEntry(username, function(host, port) {
    pomelo.init({
      host: host,
      port: port,
      log: true
    }, function() {
              // ...
    });
  });
});

客户端在查询到connector后,需要发请求给connector服务器, 第一次请求要给connector进程,因为首次进入时需要绑定对应的uid信息,这里略去详细代码:

pomelo.request('connector.entryHandler.enter', {username: username, rid: rid}, function(){
  // ...
}); 

当用户发起聊天的时候,会请求服务chat.chatHandler.send,大致代码如下:

pomelo.request('chat.chatHandler.send', {content:msg, from: username, target: msg.target}, function(data) {
  // ...
});

当有用户加入、离开以及发起聊天时,同房间的人将会收到服务端推送来的相应消息,这些在客户端是以回调的方式进行添加的,大致代码如下:

pomelo.on('onAdd', function(data) {
  // ...
});

pomelo.on('onLeave', function(data) {
  // ...
});

pomelo.on('onChat', function(data) {
  // ...
});

客户端的详细代码都在目录web-server/public/js/client.js文件中,这里,客户端的js是使用component进行管理的,详细请参阅component的参考文档。

服务端

我们知道,在pomelo中,只要定义了一个服务器的handler和remote,那么就定义了这个服务器的行为,就决定了这个服务器的类型。在本例子中,有三种服务器,gate,connector,chat,它们完成的具体逻辑如下:

  • gate完成客户端对connector的查询,在其handler了里有其实现的代码,由于在这里,本例中仅仅配置了一台connector服务器,因此直接返回其信息给客户端即可,然后客户端就可以连接到connector了。
handler.queryEntry = function(msg, session, next) {
    var uid = msg.uid;
    // ...
};
  • connector接受用户的连接,完成用户的注册及绑定,维护客户端session信息,处理客户端的断开连接,其逻辑代码在connector/handler/entryHandler.js中。大致如下:
handler.enter = function(msg, session, next) {
    var self = this;
    var rid = msg.rid;
    var uid = msg.username + '*' + rid
    var sessionService = self.app.get('sessionService');
  // .....
};
  • chat服务器是执行聊天逻辑的地方,它维护channel信息,一个房间就是一个channel,一个channel里有多个用户,当有用户发起聊天的时候,就会将其内容广播到整个channel。chat服务器还会接受connector的远程调用,完成channel维护中的用户的加入以及离开,因此chat服务器不仅定义了handler,还定义了remote。当有客户端连接到connector上后,connector会向chat发起远程过程调用,chat会将登录的用户,加到对应的channel中,其大致代码为:
// chatHandler.js
handler.send = function(msg, session, next) {
    var rid = session.get('rid');
    var username = session.uid.split('*')[0];
    // .....
};

// chatRemote.js
ChatRemote.prototype.add = function(uid, sid, name, flag, cb) {
    var channel = this.channelService.getChannel(name, flag);
};

ChatRemote.prototype.kick = function(uid, sid, name) {
    var channel = this.channelService.getChannel(name, false);
  // ...
};
  • 注意 在实现具体的Handler的时候,最后需要调用next,其中next的签名为 next(err, resp).如果没有出现错误,那么err为空即可;如果不是request请求,而是notify的话,则一样需要调用next,此时resp参数是不需要的,一般情况下,如果没有错误的话,就直接使用next(null)即可。

服务器配置信息在config目录下,现在我们只关注servers.json, master.json。master.json配置是master服务器的配置信息,包括地址端口号,servers.json配置具体的应用服务器信息。在配置文件中,分为development和production两种环境,表示开发环境和产品环境,我们在pomelo start后面可以通过-e可以指定使用哪个环境,更多帮助参见pomelo start --help。

小结

在这部分,我们下载了一个简单的聊天应用,并安装运行起来,并对其源码进行了分析。在本例子中,为了简单起见,我们对每一种类型仅仅配置一台服务器,其中对于前端服务器来说需要指定frontend为true。下一步,我们将对每一种服务器类型配置多台服务器,以此来展示pomelo强大的可伸缩性。

pomelo源码分析(一) 千里之行始于足下,一直说想了解pomelo,对pomelo有兴趣,但一直迟迟没有去碰,虽然对pomelo进行源码分析,在网络上肯定不止我一个,已经有很优秀的前辈走在前面,如http://golanger.cn/,在阅读Pomelo代码的时候,已经连载到了11篇了,在我的源码分析参考了该博客,当然,也会加入我对pomelo的理解,借此希望能提高一下自己对node.js的了解和学习一些优秀的设计。 阅读详情

相关推荐

pomelo研究笔记-RPC服务端

POMELO 采用多进程的架构可以很好的实现游戏服务器(进程)的扩展性,达到支撑较多在线用户、降低服务器压力等要求。进程间通信采用RPC的形式来完成,pomelo的RPC实现的相当精巧。采用类似如下的方式就可以调用remote服务器提供的服务:proxies.user.test.service.echo(routeParam, 'hello', function(err, resp) { i

GentlyCare的专栏 3742

pomelo入门

一直觉得没有读过什么node.js的框架,觉得很遗憾。。。好了,从今天开始,读pomelo的源代码。。。 网易开源的游戏服务器框架,看介绍。。应该还不错。。先看看吧。。。 从它给的聊天的例子来开始吧。。。比较简单。。。无非就是web端通过websocket发送数据到服务器,然后服务器再广播给同房间的人就ok了。。。 我们先来看看pomelo发送数据的格式吧,也就是它的encode方法: //

fjs的专栏 3192

pomelo源码分析.docx

pomelo源码分析 简单介绍pomelo源码已经框架结构,让你更好的理解整个框架

Pomelo 使用教程

继"Hello World"之后,我们参照官方文档,以一个"Chat"为例进一步学习Pomelo的使用。在本文中,将会涵盖筛选器、路由及消息压缩、RPC调用、组件等主要Pomelo特性的使用。 概述 "Chat"源码下载及安装 扩充服务器及Router 添加筛选器(Filter) 路由压缩 Protobuf压缩数据 RPC调用 组件的使用 Admin模块 1. 概述 在使用本教程前,请注意以下几点: 本教程适用于对Pomelo零基础的用户,如果你已有一些相关基础,那么可以跳过本教程,直

awhlmcyn的博客 3890

libpomelo:[已弃用]请转到https

该项目已弃用,请转到 ## libpomelo libpomelo是用于Pomelo的C语言客户端SDK,支持Pomelo 0.3版本中的Pomelo协议定义。 主页: : 邮件列表: : 文档: : Wiki: : 问题: : 标签:游戏,nodejs ##依赖 跨平台层,主要使用网络IO和线程。 -JSON编码和解码库。 ##用法 ###创建客户端实例 // create a client instance. pc_client_t *client = pc_client_new(); ###添加侦听器 // add some event callback. pc_add_listener (client, " onHey " , on_hey); pc_add_listener (client, PC_EVENT_DISCONNECT,

ATMGame_pomelo

启动项目 启动 gamer-server 服务器: $ cd game-server $ pomelo start 启动 web-server 服务器: $ cd web-server $ node app 关闭项目 可以使用一下两种方式关闭项目: $ cd game-server $ pomelo stop 或者 $ cd game-server $ pomelo kill 明显推荐前者 查看服务器 可以使用 pomelo list 查看已经启动的服务器。 服务器状态可以查看5种状态信息: serverId:服务器的serverId,同config配置表中的id。 serverType:服务器的serverType,同config配置表中的type。 pid:服务器对应的进程pid。 headUsed:该服务器已经使用的堆大小(单位:兆)。 uptime:该服务器启动时长(单位:分钟)。

pomelo分布式聊天服务器详解

pomelo分布式聊天服务器详解   2014-01-05 11:43:49|  分类: node |  标签:pomelo  pomelo聊天  nodejs分布式聊天  pomelo分布式  |举报|字号 订阅 说来也惭愧,知道pomelo框架已经一年有余了,最近因为有开发IM的需求,但却是第一次部署安装pomelo框架,对不起网易开发团队的朋友~ pomelo的

chaixinke的专栏 4687

【asrpro语音模块+语音控制小风扇】

智能语音控制小风扇,使用ASRPRO语音模块只要一句话就能设置小风扇不同挡位的风力。图形化编程简单有效的控制输出PWM的占空比。

qq_57234300的博客 1万+

pomelo源码解析之组件解析(一)

文章目录RPC组件RPC服务器组件后端特殊remote:msgRemote前端特殊remote:channelRemote前端特殊remote:sessionRemoteRPC客户端组件给rpc-client添加可rpc的地址rpc消息的前后过滤总结 RPC组件 RPC是用于服务器进程间通讯的一种实现,能够以类似函数调用的方式来实现进程间通讯 这个组件基于pomelo-rpc实现,也就是额外封装了...

versace的博客 653

保姆级教程:在RK3568 Debian系统上搞定AIC8800 WiFi与蓝牙驱动(含固件路径与开机自启脚本)

本文提供在RK3568 Debian系统上配置AIC8800 WiFi与蓝牙驱动的保姆级教程,涵盖驱动移植、固件部署、开机自启脚本等关键步骤。通过详细的硬件连接指南、内核配置示例和常见问题解决方案,帮助开发者快速实现无线模块的全功能配置,特别适合嵌入式Linux开发者参考。

weixin_28684825的博客 379

U8-固定资产月末结账报错:BOF或EOF中有一个是真

度了下,发现此问题一般是由于fa_Vtsobject表缺少对应月份的记录导致,补上即可,但是查看发现此表记录正常。 跟踪后发现定位到以下语句: select * from AccInformation where cSysID = N'FA' and cName =N'bVoucherApply'上述语句执行后没有任何记录显示,但是在正常的账套执行是有记录的,那有可能就是记录丢失导致,执行以下

guizhouakun的博客 5917

pomelo源码解析(总结)

pomelo启动都干了什么从哪里启动的createApp做了什么configure做了什么start做了什么其他进程怎么启动的?其他进程的start做了什么总结 这是pomelo源码分析的最后一篇文章。讲一下典型的一个pomelo引擎做了什么 从哪里启动的 我们知道一个pomelo启动是这样子的pomelo start 可以看下电脑的环境变量,最终执行文件在pomelo/bin/pomelo pr...

versace的博客 1752

【RT-DETR涨点改进】全网独家首发、注意力改进篇 | ICLR 2026 | 引入 MHLA 多头线性注意力,关注不同的上下文区域,弥补卷积的长程依赖建模方面的不足,助力高效涨点,来自北京大学

🔥本文提出MHLA多头线性注意力模块,用于改进RT-DETR目标检测网络。MHLA通过恢复线性注意力的表达能力,在保持线性复杂度的同时,为网络提供高效的全局上下文建模能力。该方法解决了传统线性注意力在长序列建模中的"全局上下文坍塌"问题,使不同空间位置能关注不同上下文区域。实验表明,MHLA显著提升了RT-DETR在复杂背景、小目标和遮挡场景下的检测性能,且不增加显著计算开销。文章详细介绍了MHLA的原理、优势及8种改进方案,并提供了完整的代码实现和配置指南。

Ai缝合怪、助力小伙伴高效发论文 271

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

一。基本步骤  注意:pomelo-cocos2d-jsb 没实用 https://github.com/NetEase/pomelo-cocos2d-jsb,原因这个不是最新版,另外,component根文件没有 pomelo-cocos2d-jsb 用的是 https://github.com/NetEase/chatofpomelo-websocket/tree/master/w...

weixin_34247299的博客 109

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

王老师青少年编程 1718

OpenClaw 性能调优五步法

本文介绍了优化OpenClaw性能的五步方法,将响应时间从3秒降至300毫秒。首先建立性能基线,分析模型加载、上下文检索等主要瓶颈。五步优化包括:1)启用模型缓存减少60%延迟;2)优化记忆检索策略降低25%延迟;3)并行化工具调用节省40%时间;4)智能选择轻量级模型减少50%推理时间;5)启用流式输出改善70%感知延迟。最终整体性能提升10倍,并建议建立持续监控机制。这些优化方法经过实战验证,适用于不同规模的OpenClaw部署场景。

刘一说的IT专栏 1436

【Pomelo源码分析】2016-09-20 入门(pomelo命令)

Pomelo源码分析第一篇, 从pomelo命令开始

u010334580的博客 2633

【YOLOv11改进- 主干网络】YOLOv11+RepViT: 从ViT的角度重新审视Mobile的CNN助力YOLOv11有效涨点;

本文给大家带来的改进内容是在YOLOv11中更换主干网络为RepViT,助力YOLOv11有效涨点,论文通过集成轻量级 ViT 的高效架构设计,逐步增强了标准轻量级 CNN(即 MobileNetV3)的移动友好性。这最终产生了一个新的纯轻量级 CNN 系列的主干网络。

qq_41304809的博客 786

pomelo源码解析之组件解析(四)

文章目录消息处理组件server过滤器globalFilterService、filterService处理消息模块handlerService计划任务模块cronHandlers监听client的服务器组件包含哪些东西?采用哪种连接this.connector加解密this.encode this.decode是否RSA加密this.useCrypto是否黑名单过滤this.useHostFil...

versace的博客 1391

【深度学习驱动流体力学】采集OpenFOAM仿真数据作为AI模型训练数据集与卷积神经网络搭建到预测(一站式完整代码实现)

采集OpenFOAM仿真数据作为AI模型训练数据集与卷积神经网络搭建到预测(一站式完整代码实现)

源代码杀手的博客 1414

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Pomelo聊天室源码分析(一)

Pomelo 0.2 node.js 0.8 由于0.3版本的不稳定,不想花时间到兼容性升级上,等等稍微稳定一下再升级,接下来的分析都是基于这个版本源码进行分析 开篇前,先引用pomelo的wiki:https://github.com/NetEase/pomelo/wiki/tutorial1--%E5%88%86%E5%B8%83%E5%BC%8F%E8%81%8A%E5%A4%A9

我叫河蟹 4874

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pomelo源码解析之组件解析(总结)

文章目录基础知识学习pomelo中到底包含了什么东西 基础知识学习 需要的一些基础知识: nodejs的加载 模块怎么包装的 模块到底导出了什么 js中的两个添加属性的接口: defineProperty实际是__defineGetter__的升级版,后者在高版本中即将废弃,以下是文档: __defineGetter__文档 defineProperty文档 pomelo中到底包含了什么东西 使用...

versace的博客 848

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pomelo源码解析之模块解析(三)

文章目录pomelo-admin源码解析子模块解析:pomelo-admin/clientpomelo-admin/masterpomelo-admin/modulespomelo-admin/monitorpomelo-admin/protocol/mqttmqtt简单介绍mqtt库所实现的客户端和服务器详解整体结构消息传输流程对外接口tipspomelo-monitor解析 pomelo-ad...

versace的博客 2065

pomelo源码解析之模块解析(一)

pomelo是网易基于Node.js实现的一套完整的服务器引擎。 官方中文wiki:https://github.com/NetEase/pomelo/wiki/Home-in-Chinese 最近开始使用该引擎,做一个源码阅读的笔记   学习pomelo源码之前还需要学习一下Node.js的基础知识 http://nodejs.cn/api/modules.html 官方文档,可以先学...

versace的博客 1430

pomelo源码解析之模块解析(五)

文章目录pomelo/lib/connectors1. sioconnector2. hybridconnector3. udpconnector4. mqttconnector总结 pomelo/lib/connectors 4个模块都是服务器,都是继承自EventEmitter,只是支持的通信协议有差别 1. sioconnector 通信协议:基于socket.io的websocke...

versace的博客 973

pomelo源码分析(二)

接着(一)所分析的代码 // app configure app.configure('production|development', function() { // route configures app.route('chat', routeUtil.chat); // filter configures app.filter(pomelo.timeout()); }); 根

我叫河蟹 9763
上一篇: pomelo 常见术语
下一篇: pomelo 配置修改
bugall
博客等级 码龄16年 20粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值