我的帐号退出
登录为 roycai
主页我的工作台项目帮助
搜索:
消息系统
概述
活动
Wiki
Wiki
起始页 按标题索引 按日期索引 跟踪 Wiki »
消息协议V1.0 协议格式 纯文本协议,采用JSON封装,消息之间按行’\n’读取。
协议字段 version:[必选],用于标识当前协议版本。采用两位递增整数格式,数值越大版本越高,第一位表示协议版本号,同一版本之间可相互兼容,不同版本之间可能不兼容;第二位表示修订版本号;两位数字之间用半角小数点连接。 示例: “version":"1.1","version":"2.11","version":"11.1","version":"12.11” type:[必选],消息信号类型。 选项: RQB:请求绑定。 RQM:请求消息。 ACK:应答信号。 MSG:消息内容。 HRB:心跳信号。 FIN:结束连接。 sequence:[可选]当前信号的序列,用于需请求应答的信号,一般应答方会返回请求方原内容。 message:[可选]消息正文内容,用于通讯本身的信号可忽略。 子字段: text:[可选]文本内容。 badge:[可选]应用程序标记,用于信息条数显示。 sound:[可选]声音。 type:[可选]类型。 UNREAD:[可选]未读消息。 FOLLOWED:[可选]粉丝。 COMMENT:[可选]评论。 ATME:[可选]@。 DM:[可选]私信。 timestamp:[可选]信号产生的时间戳,1970-01-01 00:00:00至当前时间的毫秒数。 通讯模型 ±-------+ ±--------------+ | |–(1)- RQB…’165394546d3ae’ ->| | | | | | | |<-(2)- ACK…’165394546d3ae’ --| | | | | | | |–(3)- RQM…’992ed0f169bd3’ ->| | | | | | | |<-(4)- ACK…’992ed0f169bd3’ --| | | Client | | Server | | |<-(n)- MSG…’hello world…’ --| | | | | | | |–(n)- HRB…’02b9964b39668’ ->| | | | | | | |<-(n)- ACK…’02b9964b39668’ --| | | | | | | |–(n)- FIN…’6d3ae757ba999’ ->| | ±-------+ ±--------------+
当Socket连接建立后: 第一步:客户端向服务端申请连接绑定: 当前协议版本1.0,信号类型是申请绑定,本条信号序列是165394546d3ae,消息内容为客户端机器ID,当前时间戳1335593341387 {"version":"1.0","type":"RQB","sequence":"165394546d3ae","message":{"text":"e156b0b4-8bac-488d-ac22-ba8009f5564b"},"timestamp":"1335593341387"}
第二步:服务器接收到绑定申请后,将当前Socket连接和机器ID进行绑定,绑定成功即向客户端返回应答信号: {"version":"1.0","type":"ACK","sequence":"165394546d3ae","timestamp":"1335594531327"}
第三步:客户端得到服务器反馈后确认服务端已经成功绑定(如果长时间不能得到反馈,客户端可重复第一步),客户端准备就绪,向服务端申请消息推送: {"version":"1.0","type":"RQM","sequence":"992ed0f169bd3","timestamp":"1335594704794"}
第四步:服务端收到推送申请后,返回答应信号,并开始等待消息接收事件: {"version":"1.0","type":"ACK","sequence":"992ed0f169bd3","timestamp":"1335594847643"}
第N步:服务端向客户端推送消息: {"version":"1.0","type":"MSG","sequence":"d6bc87524bfd7","message":{"text":"hello world!","badge":"3","sound":"default","type":"DM"},"timestamp":"1335595488598"}
第N+1步:客户端收到推送信息后向服务端反馈:(目前服务端没有实现重传机制,所以这一步可以不选) {"version":"1.0","type":"ACK","sequence":"d6bc87524bfd7","timestamp":"1335596028670"}
第N步:客户端可向服务端发送心跳信号,确认连接是否还生效: {"version":"1.0","type":"HRB","sequence":"02b9964b39668","timestamp":"1335595720860"}
第N+1步:服务端收到心跳信号后给出回馈: {"version":"1.0","type":"ACK","sequence":"02b9964b39668","message":{"text":"Sat Apr 28 14:58:45 CST 2012"},"timestamp":"1335595840562"}
第N步:客户端可能收到服务端发送心跳信号,确认连接是否还生效(一般情况服务端不会主动发送心跳信号,在服务器需要做资源回收会主动向客户端检测连接是否存活): {"version":"1.0","type":"HRB","sequence":"02b9964b39668","timestamp":"1335595720860"}
第N+1步: 客户端收到心跳信号后必须给出回馈,否则服务端有可能认为失效连接进行回收 : {"version":"1.0","type":"ACK","sequence":"02b9964b39668","message":{"text":"Sat Apr 28 14:58:45 CST 2012"},"timestamp":"1335595840562"}
最后一步:客户端向服务端申请关闭连接,无需等待回应,客户端丢失,服务端可自动失效: {"version":"1.0","type":"FIN","sequence":"6d3ae757ba999","timestamp":"1335596101092"} Powered by Redmine © 2006-2012 Jean-Philippe Lang