Pomelo中有四种消息类型的消息,分别是request
、response
、notify
、push
。
Pomelo客户端和服务器之间的通讯方式分为三种形式
request/response
请求响应是一组,由服务器接收客户端request
请求,处理完逻辑后做出response
响应。Pomelo中最常见的场景是Request/Response模式,客户端发送请求服务器异步响应。客户端的请求发送形式类似AJAX。
pomelo.request(url, msg, function(data){});
参数 | 描述 |
---|---|
url | 请求地址,完整地址包括三部分:服务器类型、服务端相应文件名、服务端相应方法名 |
msg | 消息体,可为JSO格式 |
callback | 回调函数,请求的响应会将结果放置在回调函数中返回给客户端。 |
notify
是单向的,是客户端发给服务器的通知,是不需要服务器给与回复的请求。notify
与request-response
类似,唯一区别是客户端只负责发送消息到服务器,客户端不接收服务器的消息响应。
pomelo.notify(url, msg);
push
是服务器主动给客户端推送的消息,由客户端注册监听事件,处理具体的事件逻辑,比如公告、邮件等。push
是服务器主动向客户端进行消息推送,客户端根据路由信息进行消息区分进行转发。通常游戏服务器都会发送大量此类广播。
pomelo.on(route, function(data){});
客户端如何发送请求?
客户端可以向服务器发送两种类型的消息分别是request
请求和notify
通知。
request
请求是双向的消息,也就是说服务器接收到一个客户端消息的时候,就得向客户端发回一个响应消息。此时Pomelo会发射出一个与请求相关得回调。//客户端发送请求
pomelo.request("connector.helloHandler.ast", {msg:"hello"}, function(resp){});
notify
通知是单向得消息,服务器无需提供响应。比如公告、通知、邮件等。// 客户端发送通知
pomelo.notify("connector.helloHandler.say", {msg:"hi"});
服务器如何处理客户端消息?
Pomelo将进程流分为两部分分别是handler
处理器和filter
过滤器,handler
处理器负责提供游戏逻辑,filter
过滤器需要做前置和后续工作,比如日志和超时处理等。
前置过滤器beforeFilter
客户端发送的消息需要通过beforeFilter
前置过滤器链来做一些前置处理,比如说验证当前玩家登录状态以及日志记录。
// 前置过滤器的接口
// msg 表示从客户端接收的消息对象
// session 表示当前用户的会话对象
// next 表示接下去的流程的回调函数
filter.before = function(msg, session, next){};
前置过滤器需要调用next()
函数来跑到前置过滤器链中的下一个前置过滤器,当它穿过整条前置过滤器链时,将最终进入处理器。如果next()
的第一个参数传入错误,则会出现错误进而停止进程流。
处理器handler
处理器时实现游戏逻辑的核心
//处理器接口
handler.methodName = function(msg, session, next){};
错误处理器errorHandler
错误处理器是一个可选项,它会处理全局错误,比如未知错误以及错误报告。
//设置错误处理器
app.set("errorHandler", errorHandler);
错误处理器接口
// 错误处理器接口
// err是前置过滤器或处理器传入的错误对象
// resp是处理器本来将要传送给客户端的响应消息
errorHandler = function(err, msg, resp, session, next){};
后续过滤器afterFilter
进程流最终会由后续过滤器来结尾,后续过滤器负责后续的处理,比如释放请求上下文资源,记录请求的处理事件。后续过滤器不会修改响应消息,因为在进入后续过滤器链之前,消息就已经发送到客户端了。
//后续过滤器接口
filter.after = function(err, msg, resp, session, next){};