-
Notifications
You must be signed in to change notification settings - Fork 33
notification zh
服务通知分为 Comet Monitor 和 Comet 下发给应用服务器的通知。所有的消息通知都将请求到启动的时候指定的配置文件(如 comet.ini)中的 rpc_api_url
地址,请求方式均为POST
,为了验证请求有效性,请求的时候采用的http header中 User-Agent
为配置中的rpc_user_agent
字符串。请求内容body为json字符串。json格式如下:
{
"class": "Im", //string 固定为 "Im"
"method": "", //string 通知类型,以下具体描述
"args": [ //数组 回调方法参数
arg1,
arg2
]
}
PHP接受请求参考:
$agent = 'CtxImRpc 1.0';
$body = file_get_contents('php://input');
$data = json_decode($body, true);
if (json_last_error() !== JSON_ERROR_NONE || ! is_array($data)) {
throw new \Exception('请求非法' . var_export($body, true));
}
if (isset($_SERVER['HTTP_USER_AGENT']) &&
$_SERVER['HTTP_USER_AGENT'] == $agent &&
isset($data['class'], $data['method'])
) {
$class = $data['class'];
$method = $data['method'];
$args = isset($data['args']) ? $data['args'] : array();
header('Content-Type: application/json; charset=utf-8');
$im = new $class;
$data = call_user_func_array(array($im, $method), $args);
return $this->success($data);
} else {
throw new \Exception("非法的请求");
}
Comet Monitor 服务主要是是监视 Comet 服务运行情况,下发的通知主要包括两种:
在以下两种情况的时候,Comet Monitor会通知应用服务Comet上线。
- Comet Monitor服务运行中,当Comet服务上线的时候。
- Comet Monitor服务刚启动的时候,已经存在运行中的Comet服务。
{
"class": "Im",
"method": "addCometServer",
"args": [
node, //string 节点,/comet/cometRpcAddr,如 /comet/192.168.3.165:8901
revision //big64 唯一通知版本号,如 337,方便当存在多个 Monitor 同时运行的时候,消息重复下发,导致应用服务进行了错误处理
]
}
Comet Monitor 服务不关心应用服务的返回值,当做成功处理。
当Comet服务上线的时候,Comet Monitor会通知应用服务Comet下线。
{
"class": "Im",
"method": "removeCometServer",
"args": [
node, //string 节点,/comet/cometRpcAddr,如 /comet/192.168.3.165:8901
revision //big64 唯一通知版本号,如 338,方便当存在多个 Monitor 同时运行的时候,消息重复下发,导致应用服务进行了错误处理
]
}
Comet Monitor 服务不关心应用服务的返回值,当做成功处理。
Comet 服务作为长连接的接入层,接管所有的长连接。客户端跟Comet服务进行连接之前需要先到应用服务申请连接的token,方便后续客户端连接Comet服务的时候进行token校验以确定连接合法,客户端与Comet服务连接的url格式生成规则为 {协议}://{cometRpcAddr}/ws?c={connId}&t={token}&i={clientInfo}
,如:ws://comet.demo.com:8900/ws?c=conn-id-123&t=token-abc&i=client-info-xx
, PHP参考如下:
/**
* @var $connId, string 分配给client唯一的接入id,如 uid + '平台' + uniqid()等.
* @var $token, string 需要校验的token值
* @var $clientInfo, string 自定义client相关信息 clientInfo ,在后续客户端连接成功后上线回调和下线回调中原样传递
*/
$url = sprintf('ws://comet.demo.com:8900/ws?c=%s&t=%s&i=%s', $connId, $token, $clientInfo);
Comet 服务下发的通知主要包括三种:
当客户端连接到Comet服务,Comet服务会请求应用服务,进行校验连接是否有效。
{
"class": "Im",
"method": "checkToken",
"args": [
ConnId, //string ConnId
Token, //string token
ClientInfo, //string 自定义的client相关信息
cometRpcAddr //string client连接的comet服务rpc的地址,如 192.168.3.165:8901,方便应用服务在自定义负载均衡时候进行校验是否连接到了指定的comet服务上。
]
}
注意: 此通知消息,Comet 服务关心应用服务的响应结果:
- http code 必须为 200
- 响应内容必须为json,格式如下:
{
"code": 0, //int 必须为0
"data": true,
"error": "", //string
}
如果不满足以上要求的响应结果,Comet服务视为客户端token校验失败,将会断开客户端建立的连接。
当客户端上线的时候,Comet 会通知应用服务有客户端连接到Comet服务,上线成功。
{
"class": "Im",
"method": "online",
"args": [
ConnId, //ConnId
Info, //自定义client相关信息
rpcAddr //当前comet服务的rpc地址
]
}
当客户端下线的时候,Comet 会通知应用服务有客户端从Comet服务下线成功。
{
"class": "Im",
"method": "offline",
"args": [
ConnId, //ConnId
Info, //自定义client相关信息
rpcAddr //当前comet服务的rpc地址
]
}
^_^ 2018.