精英盒子 -> 零毫秒 -> 零毫秒SB2.x设计草稿,灰常草,狂草 [打印本页]

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协议没有提供差错重传机制

----配置漫游
配置漫游信息是一组键/值(字符串的键/二进制的值)对应的信息,保存在服务器,用于客户端漫游一些设置
****请求配置信息键名
参数:无

****配置信息键名列表
参数:键名列表

****请求键内容
参数:键名

****键内容
参数:键名、二进制数据

****修改键值
参数:键名 二进制数据

****删除键
参数:键名



kevin 2012-01-10 09:43
已阅

zeroms 2012-01-10 10:23
我是来看热闹的

scxyscxy 2012-01-10 20:27
感觉好乱

mason 2012-01-10 21:16
话说手机版的phpwind怎么感觉这么白痴?

内容来自[手机版]

whtsky 2012-01-10 22:07
mason:话说手机版的phpwind怎么感觉这么白痴?
内容来自[手机版]  (2012-01-10 21:16) 

何止白痴,根本就是2B
你看代码试试




Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.051043 second(s),query:5 Gzip enabled