| jybox |
2012-01-09 23:58 |
零毫秒SB2.x设计草稿,灰常草,狂草
SB2.x整体设计 整体设计了大概有哪些消息,哪些参数 没有详细约定细节
SC:服务器对客户端发送的消息 CS:客户端对服务器发送的消息 CC:客户端对客户端发送的消息
----用户表示方法: 用户表示方法是基于用户名的,但也可以使用用户id 用户名:一个字符串,只允许包括大小写字母、下划线、数字或中文,且开头必须为字母 用户id:一个数字,不以0开头,通常为顺序号
用户的注册工作交给网页
群名和用户名约定一样,也可以用群id表示 表示群的时候在群名前加星号,例如*jybox或者*123
临时讨论小组为一个星号加一个零开头的随机数字 例如*0852或*0456
群、临时讨论小组、用户,统一对待, 比如,好友列表里其实也包括群和临时讨论小组 在发送消息的时候,目标用户可以填用户、群也可以填临时讨论小组
****登陆消息(CS) 参数:用户名、经过散列的密码、p2p端口号、是否是主连接、是否强制登陆、是否隐藏ip 密码的散列方式:SHA-256(公钥+SHA-256(密码)) p2p端口号用于支持CC消息的传输,采用UDP协议(UDP对坑爹运营商的各种网络限制穿透能力比较好) 是否是主连接:只有主连接算是在线,客户端可以采用多个非主连接实现多线程的下载上传图片 是否强制登录:如果服务器告知客户端登录失败是因为有同名用户在线,客户端可以加上这个参数重试,把对方顶下线 是否隐藏ip:客户端可以选择不向其他客户端暴露ip,但是这样可能无法使用一些p2p功能(例如传文件),在选择隐藏ip的情况下可以不提供p2p端口号 该消息可以使一个客户端从未认证状态转为登陆状态
----非主连接 非主连接无法发送聊天消息,但可以,也需要完成聊天图片的下载和上传
****登陆结果(SC) 参数:登陆是否成功、错误原因、同名用户ip 错误原因的取值:密码错误、有同名用户在线、未知错误 如果是因为已有同名用户在线,则需要发送同名用户的ip(这时用户登录时设置的隐藏ip是无用的) 这时,客户端可以再登陆请求上加上强制登陆的选项
****请求对方信息(CS/SC/CC) 参数:要请求的信息的名字列表 用这个消息来向对方请求一些信息,例如时间、程序版本等等
****返回信息(CS/SC/CC) 参数:被请求的信息名称和值的对应表(例如:时间:12345798;版本:V123;) 这个是对“请求对方信息”的回应,如果“请求对方信息”中有自己无法理解的消息名字,那么可以不返回,或者返回空值 但是这里协议要求CS/SC必须支持以下信息名称:时间、程序版本号、程序名称(ps.待补充) CC则允许对方拒绝发送所有的信息(出于隐私保护目的)
****请求公钥(cs) 参数:无 客户端向服务器请求公钥
****返回公钥(SC) 参数:公钥 公钥是服务器生成的一串随机字符串,长度在10-30字符即可,每次生成的公钥都必须是唯一且完全随机的
****无法理解消息(SC) 参数:描述信息 描述信息:一个描述性字符串,指明最新版协议的地址等信息 当服务器无法理解客户端发来的消息时,发送该消息,同时丢弃缓冲区中剩余的所有数据 如果服务器对于一个客户端反复收到这个消息,服务器可以选择断开与它的连接
****保持响应(CS) 参数:无 如果客户端在一定时间内没有发来有效的消息,则服务器可以断开与之的连接 因为有时候,如果客户端出错,会导致明明客户端已经退出,但连接仍然存在的情况 为了一直保证服务器不把自己T掉线,客户端需要每隔一段时间(暂定200秒)发送一次消息,如果无消息可发,可以选择发送该消息
****需要更新好友列表(SC) 参数:列表名 列表名:若是好友列表即为自己的用户名,如果是群或临时讨论小组即为群名 如果客户端的好友的登陆状态发生了变化,服务器向客户端发送这个消息提醒客户端及时更新在线列表
****请求好友列表(CS) 参数:是否请求全部 是否包括头像 是否请求全部:是否发送全部在线列表,如果选否,即表示只发送发生变动的部分 是否包括头像:因为大多数情况下,只有第一次请求才需要头像
****好友列表(SC) 参数:是否是全部、在线列表 是否是全部:这是否是全部在线列表,如果为否,表示只是发生变动的部分 在线列表:列表中每一项是一个用户,包括:用户名、是否在线、ip、p2p端口号、头像 如果用户选择了隐藏ip,这里就不发送ip和p2p端口号 头像是头像的MD5值,客户端需要稍后从服务器下载头像 注意在线列表里也包括群和临时讨论小组,他们的在线状态始终是在线,没有ip和p2p端口号
****系统广播消息(SC) 参数:消息内容
****退出登录(CS) 参数:无 该消息可以帮助客户端从登录状态转为未认证状态 其实作用不大,如果客户端希望退出登录,可以直接断开连接
****发送消息(CS) 参数:目标用户名,是否开启匿名聊天,消息内容 消息中的图片以MD5值表示 支持发送离线消息 匿名聊天:接受者既无法知道对方的ip信息,又无法知道真实的用户名和资料 这种情况下,服务器应该对消息中的用户名加以处理,生成一个完全随机的新用户名发给接收者,而且只有服务器知道这个随机用户名与真实用户名的对应关系
----聊天记录漫游交由网页处理
****接收消息(SC) 参数:发送者,来自的视图,消息内容 来自的视图:私聊即为用户名,群聊为群名或讨论小组名 如果消息中包含图片,客户端应该先在本地缓存中查找图片,如果找不到才向服务器请求下载
****上传图片(CS) 参数:图片的二进制数据 服务器收到这个消息之后应该讲图片缓存一段时间
****请求下载图片(CS) 参数:最长等待时间 图片的MD5值 如果服务器上并没有这个图片,服务器应该等待”最长等待时间“,如果在这期间有人上传了这张图片,也把图片发给他
****返回图片(SC) 参数:图片的二进制数据
****询问图片是否存在(CS) 参数:图片的MD5值 客户端向服务器询问这个图片是否存在在服务器上
****返回图片存在状态(SC) 参数:图片剩余的缓存时间 图片剩余的缓存时间:再过多长时间,这个图片缓存会被服务器删掉 如果服务器不存在这个图片,返回负值或0
----包含图片的消息的发送过程(经服务器中转的情况) 发送者向服务器发送一个带图片的文字消息给服务器 服务器中转给接受者 发送者询问服务器是否已经存在了这个图片 if(存在) 神马也不做 else 发送者向服务器上传图片
ps.其实也可以反过来,发送者先上传图片,再发送包含图片的文字消息
接收者那边: 收到了服务器发来的带图片的消息 在本地缓存里查找是否有这个图片 if(存在) 神马也不做 else 接收者向服务器请求这个图片 然后等待服务器把图片发过来 ps.其实也可以一直询问服务器是否有这个图片,直到有了再下载
---- 其实可以随便与任何人聊天 好友申请只是请求对方把自己加入好友列表 例如黑名单等等的机制可以再客户端来实现
下面这些消息即适用于用户也适用于群和临时讨论小组
注意:服务器必须明确的收到了来自客户端的处理结果(同意或是拒绝),否则在用户下次登录的时候再次发送
****请求对方添加我/请求加入群(CS) 参数:对方用户名、来自的视图,留言 来自的视图:用户即为用户,群为群名或临时讨论小组名; 如果是请求加群,对方用户名和来自的视图都是群名 支持发送离线请求
****新好友申请(SC) 参数:对方用户名、来自的视图、留言
****新 群申请(SC) 参数:对方用户名 留言 这条消息是服务器发给群主/管理员的 只有第一条被处理的才有效 例如,A和B都是这个群的管理员,C想加群,A先通过了加群请求,之后B无论做什么都没用了
****处理好友申请(CS) 参数:对方用户名 是否同意
****请求好友资料(CS) 参数:对方用户名、要请求的项目的名字 要请求的项目的名字:例如:头像MD5值、ip、p2p端口号、邮箱、个人介绍等等
ps.该消息同样适用于群
****返回好友资料(SC) 参数:用户名 被请求的信息名称和值的对应表(例如:时间:12345798;版本:V123;) 这个是对“请求对方信息”的回应,如果“请求好友资料”中有自己无法理解的消息名字,那么可以不返回,或者返回空值 但是这里协议要求服务器必须支持以下信息名称:头像MD5值、ip、p2p端口号、邮箱、个人介绍(ps.待补充)
----群系统 群分群和临时讨论小组 临时讨论小组会在最后一个成员下线时自动销毁
临时讨论小组自由进出、拉人不用邀请(而且这个讨论组会自动加入被邀请人的好友列表) ps.不要说这里流氓,黑名单或者类似机制可以在客户端实现 而加群需要管理员认证,拉人也需要被拉人的认证
群/临时讨论小组的创建、销毁工作、管理员的授权和取消工作、群主的转让工作由网页完成 群共享文件功能由网页实现
****创建临时讨论小组(CS) 参数:无 客户端可以在发出这个消息后检查群列表里有没有新的讨论小组
----P2P(均为UDP协议) ****询问图片是否存在(CC) 参数:图片MD5
****上传图片(CC) 参数:图片二进制数据
****请求重传图片(CC) 参数:图片MD5
****请求发送文件(CC) 参数:文件MD5 文件名 文件总大小 每个分片的大小 接收者如果发现缓存中有这个文件即可以不传输 文件名用于提示用户
****同意/拒绝发送文件(CC) 参数:被处理文件MD5 是否同意 每个分片的大小 是否同意的取值:同意、拒绝、缓存中已存在(相当于拒绝) 每个分片的大小:可以直接重复“请求发送文件”中的那个值,也可以自己定一个,如果拒绝,则不发这个参数
****文件数据(CC) 参数:属于哪个文件MD5 这个分片的MD5 分片二进制数据 发送者可以将一个文件拆分成多个包来发送 这里没有差错重传,
****差错重传(CC) 参数:文件MD5 第几个分片(0开始) UDP协议没有提供差错重传机制
----配置漫游 配置漫游信息是一组键/值(字符串的键/二进制的值)对应的信息,保存在服务器,用于客户端漫游一些设置 ****请求配置信息键名 参数:无
****配置信息键名列表 参数:键名列表
****请求键内容 参数:键名
****键内容 参数:键名、二进制数据
****修改键值 参数:键名 二进制数据
****删除键 参数:键名
|
|