TWTTalk 实时聊天系统(1.0.1)
By Mark
前言:
天外天现有聊天室不能满足聊友需要,现在准备更换此系统。
一、系统技术特性:
1、 跨平台:客户端和服务器端都可跨平台使用[windows,*nix, solaris …]
2、 跨开发语言:可能使用JAVA, C ,C#开发客户端和服务器
3、 跨使用语言:中文,英文,韩文等。
4、 与数据库无关:不使用与特定数据库有关的数据库特性。
5、 开放开发过程:任何组织/个人均可参与设计和开发过程(但所有权归天外天所有)。
6、 开放源码:在开发过程中不断公开公布最新设计文档和最新代码。
二、系统功能特性:
1、 纯文本方式聊天:没有任何的附加游戏功能,没有表情图像。也不提供音频,视频功能。
2、 所有成员都可建立公共组和私有组。
3、 根据成员要求,可以永久保存其聊天记录,并提供适用于各种终端和查询服务。
4、 根据通讯协议,可以自行开发客户端。
5、 为安全和性能考虑,每一个IP只开一个线程(即只能同时与一个组聊天)。
6、 对私有组提供离线消息,而对公共组不提供;
7、 管理员通过对组的管理实现对用户的管理,并且只有通过组创建者的同意才能实现。
三、系统开发特性:
1、 面向对象,模块化开发。
2、 必须有强壮的注解,便于不断维护和升级。
3、 完备的测试功能函数,在系统运行时也能看到详细的测试信息。
四、实现:
现计划用JAVA(SWING,SOCKET)+XML+ORACLE 实现。
五、开发进度:
1、5月:详细设计,开始招人。
2、8-9月:出desktop app和applet界面及测试。
3、10月初:开始投入使用及维护。
4、说明:聊天通过协议进行,其他用户、组管理等都用jsp+javabean
六、数据库设计:
1、用户表UserInfo{@表示用户可修改,!表示用户不可修改}
序列号 | 字段 | 数据类型 | 说明 |
1 | UserId | Integer | 用户ID{PK}! |
2 | UserName | Char(20) | 用户名{用于登陆}@ |
3 | NickName | Char(20) | 用户昵称{用于显示}@ |
4 | Password | Char(64) | 密码{为md5加密过的密码}@ [要网络中传送的也是加密后的密码] |
5 | PassTips | Varchar(50) | 密码提示@ |
6 | Varchar(40) | 用户E-mail{PK}{发送注册密码}@ | |
7 | UserPic | Binary | 自定义用户图片@ |
8 | Gender | Integer | 用户性别{1为男性,0为女性}@ |
9 | DateOfBirth | DateTime | 出生日期@ |
10 | RegIP | Char(15) | 注册时的IP地址 |
11 | LastIP | Char(15) | 最后一次登陆时的IP地址 |
12 | RegTime | DateTime | 注册时的时间 |
13 | LastTime | DateTime | 最后一次登陆的时间 |
14 | LogCount | Integer | 登陆次数, 默认为0 |
15 | TalkPoints | Float | 在线时间(分种), 默认为0 |
16 | UserFlag | Integer | 用户标记:0=>正常;1=>删除 默认为0 |
17 | Comment | Varchar(255) | 其他说明 |
2、GroupUserRelation组/用户关系表 {规定每个用户最多只能创建5个组}
序列号 | 字段 | 数据类型 | 说明 |
1 | GoupId | Integer | 用户组ID{FK} |
2 | UserId | Integer | 用户ID{FK} |
3 | UserFlag | Integer | 标记 0:用户请求加入但未经创建者通过; 1:已经创建者同意加入; 2:已被创建者删除/禁止; 3:用户自行退出{若创建者退出,则GroupInfo.GroupFlag=1,即为删除}; |
3、分组表GroupInfo
序列号 | 字段 | 数据类型 | 说明 |
1 | GroupId | Integer | 用户分组ID{PK} |
2 | CreateUserId | Integer | 组创建者ID |
3 | GroupName | Char(50) | 用户组名称@ |
4 | CreateTime | DateTime | 创建时间 |
5 | GroupFlag | Integer | 标记{0:使用中;1:已经自杀;2:被管理员关闭) |
6 | GroupType | Integer | 组类别: 0:公共组=>任何人匀可登入,其成员为所有用户,但在数据表(GroupUserRelation)中不存在,适用于有大量用户(>50)的组; 1:私有组=>加入需要有创建者同意,其成员在数据表(GroupUserRelation)中存在,适用于小量用户(<=50)的组; |
7 | Comment | Varchar(255) | 其他说明@ |
4、 Message聊天纪录(消息表)
序列号 | 字段 | 数据类型 | 说明 |
1 | Id | Integer | 序列{PK} |
2 | SrcId | Integer | 消息发送者ID |
3 | DesId | Integer | 消息招收者ID |
4 | MessageBody | Varchar(255) | 消息内容 |
5 | TalkTime | Datetime | 聊天时间(用户机器时间) |
6 | Flag | Integer | 纪录标记: 0:成功发送到用户; 1:未成功发到用户; |
七、通讯模型:
八、通讯连接操作流程:
1、服务器/客户端交互
2、服务器业务处理流程
说明:
①:如果是组创建者登陆,则更新在内存空间中的组信息;
②:从组/用户关系表(GroupUserRelation)中载入对应于该组的所有用户及其用户标记;
③:如果发送失败,将消息存入消息表(Message)中,且flag=1(未成功发到用户);
九、消息:(例子)
1、本协议中的端口:44302(可以修改)
2、消息结构:
项目 | 说明 |
Message Header | 消息头(所有消息公共包头) |
Message Body | 消息体 |
3、 消息头格式(Message Header)
序号 | 字段名 | 字节数 | 类型 | 描述 |
1 | TotalLength | 4 | Unsigned Integer | 消息总长度(含消息头及消息体) |
2 | SrcUserId | 4 | Unsigned Integer | 消息发送者的用户ID。 |
3 | Password | 64 | String | 用户之MD5加密后的密码 |
4 | DesUserId | 4 | Unsigned Integer | 消息接收用户的ID(用于私聊) |
5 | DesGroupId | 4 | Unsigned Integer | 消息接收组的ID |
6 | SequenceId | 4 | Unsigned Integer | 消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同) |
7 | CommandId | 4 | Unsigned Integer | 命令或响应类型 |
8 | Flag | 4 | Unsigned Integer | 其他参数(用位表示) |
4、 消息体(Message Body)
CONNECT_REQUEST
序号 | 字段名 | 字节数 | 属性 | 描述 |
1 | Client_IPAddr | 4 | InetAddress(Unsigned Integer) | 用户机器的IP地址。 |
2 | Version | 4 | Unsigned Integer | 双方协商的版本号(高1Byte表示主版本号,后2Byte表示次版本号,最后1Byte为更新版本号)。 |
3 | Timestamp | 8 | Unsigned Integer | long |
4 | Flag | 4 | Unsigned Integer | 参数 |
注:目前的Version定为1.0。
CONNECT_RESPONSE
序号 | 字段名 | 字节数 | 属性 | 描述 |
1 | errno | 1 | Unsigned Integer | 状态 0:正确 1:消息结构错 2:非法IP地址 3:版本太高 4~ :其他错误 |
2 | Timestamp | 8 | Unsigned Integer | 时间戳的明文,由客户端产生。long |
3 | Version | 4 | Unsigned Integer | 服务器支持的最高版本号 |
十、人员需要:
1、项目管理人员;
2、本系统详细设计人员;
3、jsp + javabean开发人员{开发用户/组管理及聊天纪录查询};
4、oracle数据库管理人员;
5、applet + socket开发人员{只实现在公共组里聊天的功能};
6、swing + socket开发人员{实现所有功能};
十一、条件:
1、 专业、年级、性别、身高、肤色。。。不限;
2、 天外天人员/非天外天人员匀可;
3、 有实力,浓厚兴趣;
4、 特别想为此而吃苦;
5、 愿意接受天外天资深人员指导;
十二:联系方式:
QQ:297601
Email:mark_cui@126.com