pomelo 协议

分析的是hybridconnector,使用的chatofpomelo-websocket(pomelo为0.7.0)

參考:https://github.com/NetEase/pomelo/wiki/Pomelo-通讯协议

http://cnodejs.org/topic/51395fd0df9e9fcc5882576c

client握手:

pomelo在init时候,创建WebSocket连接。并定义onopen onmessage回调,

连接建立后,onopen被回调。client首先发送握手包var obj = Package.encode(Package.TYPE_HANDSHAKE, Protocol.strencode(JSON.stringify(handshakeBuffer)));

參数为。假设version在client有缓存,将使用缓存{

‘sys‘: {

‘version‘: ‘1.1.1‘,

‘type‘: ‘js-websocket‘

},

‘user‘: {

// any customized request data

}

}

这种方法中,package格式为type。length。body。传入的參数为type和body,

服务端发回message,在onmessage中处理server到client的握手响应,服务端发回的參数

{

‘code‘: 200,          // result code

‘sys‘: {

‘heartbeat‘: 3,     // heartbeat interval in second

‘dict‘: {},         // route dictionary

‘protos‘: {}        // protobuf definition data

},

‘user‘: {

// any customized response data

}

}

并分发到handshake处理。首先缓存dict和protos,然后发回var obj = Package.encode(Package.TYPE_HANDSHAKE_ACK);握手ack,至此握手完成

client打包:

Package分为header和body两部分。

Header描写叙述package包的类型和包的长度。body则是须要传输的数据内容。

详细格式參考https://github.com/NetEase/pomelo/wiki/Pomelo-通讯协议

package的body部分发送的是Message,消息头分为三部分,flag,message id,route。

详细格式參考https://github.com/NetEase/pomelo/wiki/Pomelo-通讯协议

Package.encode,打包函数比較简单,仅仅是转换大小端

Message.encode。Message的打包函数,第一步是计算包长度,message id可变,要计算,是否有路由。要计算。加上发送的内容,就是总长度,然后创建buffer填充内容。

填充内容时候,假设有路由压缩,则在填充路由的时候。填充替换过的路由。

pomelo.encode 用户数据打包函数。

这个打包的结果是Message.encode中的msg,这个函数用了处理路由压缩和protobuf压缩。

假设clientProtos中配置了路由。将用 protobuf.encode(route, msg);打包内容。假设dict定义了路由,将替换路由

程序运行的顺序刚好与以上介绍反过来,先内层后外层

client解包:

Package.decode,解包出类型和长度

Message.decode。解包id,路由。和body,注意id和路由可能不存在

pomelo.decode。假设有id。则说明是request,直接从routeMap中替换路由,然后deCompose,路由有compressRoute,则替换路由。serverProtos中要求打包路由,则用protobuf.decode解包内容

解包刚好是正常的运行顺序,先外层后内层

服务端:

使用的hybridconnector中的websocket链接

hybridconnector和hybridsocket是pomelo封装的server和socket。switch是转发。

wsprocessor是websocket处理的文件,commands目录是握手。心跳处理的逻辑

hybridconnector用 this.tcpServer = net.createServer();接受连接。switch分发tcp和websocket。

到processor处理

对于websocket的连接建立过程:

1:switch中的tcpServer转发connection到newSocket处理。newSocket将connection转发给wsprocessor处理

2:Processor.prototype.add中。httpServer分发connection消息(由于pomelo自己用net接受的连接,所以要自己用httpserver解析http协议),

http.js中用connectionListener函数处理connection消息。仅仅是为socket加入了一下处理函数(ondata下一步会用到),

3:由于socket.ondata存在,所以直接调用,在http.js中看到ondata相应websocket来说,是为了分发upgrade消息

4:在httpserver的外层还有WebSocketServer,WebSocketServer在创建的时候,会注冊httpserver的upgrade消息,用于建立websocket连接,同一时候分发connection消息

5:processor在创建的时候。注冊了websocketserver的connection消息,并再次分发

6:switch转发了processor的connection消息

7:hybridconnector注冊了switch的connection消息,用socket封装成hybridsocket。并为hybridsocket注冊handshake heartbeat disconnect closing消息,同一时候分发connection消息

8:组件connector在初始化时。注冊了hybridconnector的connection消息,用bindEvents,为hybridsocket注冊了disconnect  error message消息。至此连接建立

对于websocket的握手过程:

1:消息的起源处是,socket分发message消息。在hybridsocket中,收到消息,用Package.decode(msg)解包,解包函数与client一致,握手请求分发到handleHandshake。分发传入的socket为hybridsocket类型

2:handleHandshake将上一步解析出的msg,将body通过JSON.parse(protocol.strdecode(msg.body))转成json,用handshake消息分发出去

3:在hybridconnector中,參考【websocket的连接建立过程】7。连接时候已经注冊了handshake处理方法。将转发给handshake.handle

4:在commands的handshake中。參数heartbeat  dict sys被收集,通过服务端的握手包返回给client

5:但服务端收到握手ack包时。服务端回复client心跳包,(socket.emit(‘heartbeat‘);)。至此握手完毕

服务端心跳逻辑:

1:握手完毕后,hybridsocket分发heartbeat消息,在commands中的heartbeat处理,在heartbeats字典中。存储计时器,将在心跳时间后,发送心跳包。并注冊超时函数

2:当收到client的心跳包后。在hybridsocket处handleHeartbeat中处理。分发heartbeat消息。

在commands中的heartbeat中。要先清理超时回调,然后同1

服务端响应request:

1:消息的起源处是,socket分发message消息。在hybridsocket中,收到message消息,用Package.decode(msg)解包,解包函数与client一致,通过hybridsocket分发解析后的msg

2:參考【websocket的连接建立过程】8,在connector处理了解析后的msg,首先调用 self.connector.decode(msg);hybridconnector中的decode与client的解包一致,

先调用Message.decode(msg.body);然后替换路由。和用protobuf解压缩

3:然后handleMessage。将解析后的请求,分发到相应的server处理,回调的结果通过self.send(msg.id, msg.route, resp, [session.id], {isResponse: true}, function() {});返回给client

send中会将发送的内容通过emsg = this.connector.encode(reqId, route, msg);打包成message,代码在hybridconnector中,与client逻辑同样

4:connector的send方法。通过组件__pushScheduler__发送,并在下一帧调用回调函数(reqest的回调为空函数)

5:组件__pushScheduler__发送,不论是广播还是推送,都是通过sessionService.sendMessage发送,然后调用session的send方法

6:sessionservice逻辑中。session是在【websocket的连接建立过程】8中的bindevents中生成的。成员变量__socket__是hybridsocket,所以。session的send方法通过hybridsocket的send实现

7:hybridsocket的send中this.sendRaw(Package.encode(Package.TYPE_DATA, msg)); 至此服务端完毕对request的响应

服务端的push不再详说

时间: 2024-08-17 15:42:48

pomelo 协议的相关文章

Pomelo开发中Web客户端开发API简介

使用pomelo做服务端开发时,无论什么客户端,只要能遵循与服务端的线上协议,就能够与服务端建立通信.pomelo内建提供的sioconnector和hybridconnector都定义了自己的协议格式,其中sioconnector用于socket.io的通信,hybridconnector则用来处理websocket和tcp的连接通信.为了方便客户端的开发,pomelo提供了部分平台的客户端SDK,主要包括用于Web端的JavaScript的SDK以及基于C/C++语言开发的libpomelo

pomelo【1】起步、概述

笔记来自:https://github.com/NetEase/pomelo/wiki/Home-in-Chinese 1.起步 1.1.欢迎使用pomelo pomelo是一个游戏服务器框架,与以往单进程的游戏框架不同, 它是高性能.高可伸缩.分布式多进程的游戏服务器框架. pomelo包含:框架.库.工具.客户端库.demo. pomelo优势 架构的可伸缩性好 易用 框架的松耦合和可扩展性好 完整的demo和文档 pomelo的定位 pomelo是一个轻量级的服务器框架,它最适合的应用领域

Cisco-HSRP 热备份路由器协议-配置实例

同样的,首先做一些理论的扫盲.最起码要知道自己在配什么东西才行. 简介 HSRP(Hot StandbyRouter Protocol 热备份路由器协议)是Cisco的专有协议.HSRP把多台路由器组成一个"热备份组",形成一个虚拟路由器.这个组内只有一个路由器是Active(活动)的,并由它来转发数据包,如果活动路由器发生了故障,备份路由器将成为活动路由器.从网络内的主机来看,网关并没有改变. HSRP的工作过程 HSRP路由器利用Hello包来互相监听各自的存在.当路由器长时间没有

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

iOS---代理与协议以及通知的使用

一.代理 1.代理的介绍 代理是一种通用的设计模式 代理使用方式:A 让 B 做件事,空口无凭,签个协议. 所以代理有三部分组成: 委托方: 定义协议 协议   : 用来规定代理方可以做什么,必须做什么 代理方: 按照协议完成委托方的需求 2. 协议的介绍 协议是定义了一套公用的接口,是方法的列表,但是无法实现. 可以通过代理,实现协议中的方法. 协议是公用方法,一般写在一个类里面. 如果多个类都使用这个协议,可以写成一个peotocol文件. 3.代理的使用 (1)委托某人做某事   先建立一

如何生成HLS协议的M3U8文件

什么是HLS协议: HLS(Http Live Streaming)是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件. HLS协议应用: 由于传输层协议只需要标准的 HTTP 协议, HLS 可以方便的透过防火墙或者代理服务器, 而且可以很方便的利用CDN进行分发加速, 这样就可以很方便的解决大规模应用的瓶颈.并且客户端实现起来也容易. HLS 目前广泛地应用于点播和直播领域,HLS协议是将音视频流通过HTTP协

新Krypt技术服务等级协议

各位用户您好, 自2017年3月20日起,Krypt将对所有独立服务器(Outlet以及R2O除外)的新订单实施新的技术服务等级协议.这项全新的改革,将直接影响到您购买每台独立服务器的成本以及后台技术工单的响应速度.请您仔细阅读下文: 全新的Krypt技术服务等级协议(SLA's)将分为基础级别Basic, 精品级别Essential, 增强级别Plus以及专业级别Pro四个不同的等级,所有已经购买的独立服务器套餐将自动被划分为Legacy等级. Krypt独立服务器与云服务器的基础SLA包括可

Http协议头

######### #概览 ######### 超文本传输协议(Http: Hyper Text Transfer Protocol) :用于发送WWW方式的数据.采用TCP/IP协议,是一个无状态协议.采用了请求/响应模型. ######### #Http请求 Request ######### 客户端向服务器发送一个请求,看图: HTTp请求包括: 1) 请求方法.URI(uniform Resource identity 统一资源标识符question/23133/. URL:统一资源定位

网络基础协议之http协议

作为一个开发人员,掌握必要的 HTTP 协议十分重要,下面就通过本文记录自己对 HTTP 协议的理解.本文很长,希望你有耐心看完,会有很多收获的,面试的时候很受用. 首先让我们从一个问题入手,当我们在浏览器中输入  http://www.baidu.com/ 访问百度的时候浏览器做了哪些事情.(这里以 Chrome 浏览器为例) 首先 Chrome 搜索自身的 DNS 缓存.(如果 DNS 缓存中找到百度的 IP 地址,就跳过了接下来查找 IP 地址步骤,直接访问该 IP 地址.) 搜索操作系统