pomelo 学习零碎记录 2
Session对象包括
socketid(累加而来),
frontendId,
socket(siosocket),
sessionService
========================================
客户端服务器互相通信的msg结构
上行:id,route,body
下行:id,body
每次发送和接收前需要分别编码和解码
==========================================
客户端请求的处理:
game-server/node_modules/pomelo/lib/components/connector.js
该文件中的connector属性默认为sioconnector(game-server/node_modules/pomelo/lib/connectors/sioconnector.js),客户端的首次连接(connection)在sioconnector.js文件中处理,然后会将连接的socket打包到siosocket中,并在其中处理message disconnect等事件. sioconnector和siosocket都继承自EventEmitter,所以2者都可以发出消息, siosocket会将socket.io的连接事件处理后发给connector,以message消息为例子:
首先在siosocket解码,然后重组成msg对象,最后用self.emit('message', msg) 发出消息
在connector.js中
socket.on('message', function(msg) {
handleMessage(component, session, msg);
});
socket实质上是siosocket,接收到的msg为解码后的数据
handleMessage中
component.server.handle(msg, session.mockLocalSession(), function(err, resp){..});
component.server为: game-server/node_modules/pomelo/lib/components/server.js
而其又调用game-server/node_modules/pomelo/lib/server/server.js的handle方法
这个server.js文件在app.start中的Application.loadDefaultComponents和Application._optComponents分别被加载和调用pro.start方法,在start内会依次调用initHandler->loadHandlers 加载所有当前服务器类型文件夹下Handle中的所有js文件
在消息路由到目标之前,先会用预制的所有过滤器对其进行处理,如果其中一个过滤器返回错误,则消息传递将终止
消息的处理最终在server.js->handle->beforeFilter->handlerService.js->handle被正确调用
请求被前端服务器handle后 ,connectror执行到:
resp = {
id: msg.id,
body: resp
};
component.session.sendMessage(session.id, resp);
其中resp为handle调用的next方法的第二个参数.
如果sessionService初始化参数opts.sendDirectly不为真:
{
接着,resp被放入到sessionService中对应sid的队列msgQueues中等候处理(默认20毫秒处理一次)
}
否则
{
直接调用session保存的socket发出msg
}