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

}

posted on 2012-12-08 19:58  皮西博维  阅读(749)  评论(0编辑  收藏  举报