QQ面向对象设计
通讯项目——仿QQ聊天程序
详细设计说明书
一、引言
此项目为验证Java语言Socket部分学习成果,本文档将对此项目进行详细说明。
二、总体设计
模块划分
本项目共分为服务器端和客户端两大模块。
服务器端共有6个模块:
等待客户端的连接,一但连接成功则分发给线程处理;
接收客户端传递来的消息;
向客户端回复应答消息;
连接数据库并进行增删改查等操作;
转发A客户端的消息给B客户端;
处理客户端下线。
客户端共有5个模块:
连接服务器;
向服务器发送消息;
接收服务器的应答消息;
接收有服务器转发的另一客户端消息;
断开与服务器的连接。
功能划分
本项目所实现的功能有:
注册,登陆,添加好友,单人聊天。
其中添加好友做了验证处理,单人聊天支持:窗口抖动,发送表情,传送文件等特色功能。
技术点支持
本项目使用Java语言编写,所涉及到的技术点有:Socket,Thread,GUI,JDBC等。
环境支持
Eclipse,MySQL
三、详细设计
数据库设计
数据库共四张表格,见下图:
由上至下分别为:组群信息表,组群与用户联系表,用户信息表,用户好友关联表。
Groups表结构如下:
Groupsusers表结构如下:
Users表结构如下:
Usersfriends表结构如下:
通信协议
消息数据类型定义
类型 |
说明 |
byte |
用于表示消息类型,一个字节的整数 |
Unsigned Integer |
网络字节顺序 |
Octet String |
定长字符串,不足在右边补齐二进制0 /0 |
消息类型
消息类型 |
标志值 |
描述 |
1 注册请求消息 |
0x01 |
客户端发送注册请求数据给服务器 |
2 注册应答消息 |
0x02 |
服务器返回注册结果 |
3 登录请求消息 |
0x03 |
客户端发送QQ号码和密码的消息请求登录 |
4 登录应答消息 |
0x04 |
服务器返回的登录结果应答消息 |
5 在线好友列表消息 |
0x05 |
服务器发送给登录成功客户端的其他好友列表消息 |
6 好友上线消息 |
0x06 |
服务器发送通知某用户好友上线消息 |
7 好友下线消息 |
0x07 |
服务器发送通知某用户好友下线消息 |
8 聊天消息发送 |
0x08 |
客户端发给服务器或服务器发给某客户端的文本聊天消息 |
9 文件传送消息 |
0x09 |
客户端发给服务器,或服务器发给某客户端的文件数据传送消息 |
10 文件传送应答 |
0x11 |
客户端发给服务器,或服务器发给某客户端的文件数据传送应答消息 |
11 截图消息发送 |
0x12 |
客户端发给服务器或服务器发给某客户端的截图消息 |
12 窗口抖动消息 |
0x13 |
客户端发给服务器或服务器发给某客户端的窗口抖动消息 |
13 创建组群请求消息 |
0x14 |
客户端发给服务器的创建组群消息 |
14 创建组群请求应答 |
0x15 |
服务器发送给客户端的创建组群应答消息 |
15 查找在线用户消息 |
0x16 |
客户端发给服务器查询在线用户的消息 |
16 查找在线用户应答 |
0x17 |
服务器应答客户端的查找消息结果 |
17 添加好友请求 |
0x18 |
客户端发给服务器请求加好友消息,或服务器发给被添加用户的加好友的请求消息 |
18 添加好友应答 |
0x19 |
服务器应答客户端加好友的结果 |
19服务器发送群组列表 |
0x21 |
登录后服务器发送个客户端该用户的群组列表 |
20查找组群请求 |
0x22 |
客户端发送给服务器的查找组群请求 |
21查找组群应答 |
0x23 |
服务器发送给客户端的查找组群应答 |
22添加组群请求 |
0x24 |
客户端发送给服务器的添加组群请求 |
23添加组群应答 |
0x25 |
服务器发送给客户端的添加组群应答 |
21群聊消息发送与接收 |
0x26 |
客户端发给服务器或服务器发给该群所有客户端的文本聊天消息 |
消息整体结构规则
结构 |
说明 |
Message Head |
消息头 所有消息公共的消息头 |
Message Body |
消息体 各种消息的消息体不同 |
消息头规则
字段名 |
数据类型 |
字节数 |
描述 |
totalLen |
int |
4 |
消息字节总长 包含消息头总长度 |
type |
byte |
1 |
消息类型 |
dest |
int |
4 |
消息目的地 消息发送给谁 |
src |
int |
4 |
消息源 谁发送的消息 |
具体消息结构定义
1、注册消息体结构
字段 |
数据类型 |
长度 |
描述 |
nikeName |
Octet String |
10 |
注册用户昵称 |
password |
Octet String |
10 |
注册用户密码 |
注册的时候,消息头中的dest值为服务器的QQ号码 |
2、注册应答消息体结构
字段 |
数据类型 |
长度 |
描述 |
state |
Octet String |
10 |
服务器返回的注册结果应答,0为成功,消息头中的dest值为注册成功的QQ号码;非0为注册失败。 |
3、登录请求消息体结构
字段 |
数据类型 |
长度 |
描述 |
pwd |
Octet String |
消息总长减去消息头长度 |
登录用户的密码 |
4、登录应答消息体结构
字段 |
数据类型 |
长度 |
描述 |
state |
byte |
1 |
0:成功 1:账号错误 2:IP验证失败 |
5、好友列表消息体结构
字段 |
数据类型 |
长度 |
描述 |
||
listCount |
byte |
1 |
好友分组个数 |
||
ListCount |
listName |
Octet String |
10 |
一个分组的名字 |
|
bodyCount |
byte |
1 |
本组内有多少个用户 |
||
组内的bodyCount个好友 |
bodyNum |
int |
4 |
组内一个好友的QQ号 |
|
nikeName |
Octet String |
10 |
好友昵称 |
||
如果有多组,后面的结构同 listCount个分组数据部分 |
6、好友上线消息体结构
字段 |
数据类型 |
长度 |
描述 |
无 |
无 |
消息头长度 |
消息头中包含消息类型 |
7、好友下线消息体结构
字段 |
数据类型 |
长度 |
描述 |
无 |
无 |
消息头长度 |
消息头中包含消息类型 |
8、聊天消息体结构
字段 |
数据类型 |
长度 |
描述 |
msgContent |
Octet String |
消息总长减去消息头长度 |
聊天的消息内容 |
9、文件传送消息体结构
字段 |
数据类型 |
长度 |
描述 |
filename |
Octet String |
10 |
传送的文件名字 |
fileData |
byte |
总长-消息头长(13)-256 |
文件内容 |
10、文件传送应答消息体结构
字段 |
数据类型 |
长度 |
描述 |
state |
Octet String |
10 |
被发送文件的客户端返回给服务器或服务器返回给发送文件的客户端的文件传送结果应答,0为接收,前者消息头中的dest值为服务器QQ号码,后者消息头中的dest值为发送文件的客户端的QQ号码;1为拒绝接收;2为发送成功;-1为发送失败。 |
11、截图发送消息体结构
字段 |
数据类型 |
长度 |
描述 |
fileData |
待定 |
消息总长减去消息头长度 |
截屏得到的图片 |
12、窗口抖动发送消息体结构
字段 |
数据类型 |
长度 |
描述 |
无 |
无 |
消息头长度 |
消息头中包含消息类型 |
13、创建组群请求消息
字段 |
数据类型 |
长度 |
描述 |
GroupName |
String |
16 |
创建的组群名称 |
14、创建组群请求应答
字段 |
数据类型 |
长度 |
描述 |
GroupID |
int |
4 |
服务器生成的群ID |
15、查找在线用户消息
字段 |
数据类型 |
长度 |
描述 |
无 |
无 |
消息头长度 |
消息头中包含消息类型 |
16、查找在线用户应答消息体结构
字段 |
数据类型 |
长度 |
描述 |
|
userCount |
int |
4 |
用户数量 |
|
userCount个用户数据 |
nikeName |
Octet String |
10 |
一个用户的昵称 |
QQNum |
int |
4 |
一个用户的QQ号码 |
|
如果有userCount个用户,后面的结构相同 |
17、添加好友请求消息体结构
字段 |
数据类型 |
长度 |
描述 |
QQNum |
int |
4 |
要添加的好友的QQ号码 |
18、添加好友应答消息体结构
字段 |
数据类型 |
长度 |
描述 |
QQNum |
int |
4 |
被添加的好友的QQ号码 |
nikeName |
Octet String |
10 |
被添加的好友的昵称 |
19、服务器发送群组列表
字段 |
数据类型 |
长度 |
描述 |
|
GroupCount |
int |
4 |
组群数量 |
|
userCount个用户数据 |
GroupName |
Octet String |
16 |
一个组群的名称 |
GNum |
int |
4 |
一个组群的ID |
|
GMasterNum |
int |
4 |
群组的ID |
|
如果有GrouopCount个组群,后面的结构相同 |
20、查找组群消息
字段 |
数据类型 |
长度 |
描述 |
无 |
无 |
消息头长度 |
消息头中包含消息类型 |
21、查找组群应答
字段 |
数据类型 |
长度 |
描述 |
|
GroupCount |
int |
4 |
组群数量 |
|
userCount个用户数据 |
GroupName |
Octet String |
16 |
一个组群的名称 |
GNum |
int |
4 |
一个组群的ID |
|
GMasterNum |
int |
4 |
群组的ID |
|
如果有GrouopCount个组群,后面的结构相同 |
22、添加组群请求
字段 |
数据类型 |
长度 |
描述 |
GID |
int |
4 |
要添加的群的ID |
23、添加组群应答
字段 |
数据类型 |
长度 |
描述 |
|
userCount个用户数据 |
GroupName |
Octet String |
16 |
一个组群的名称 |
GNum |
int |
4 |
一个组群的ID |
|
GMasterNum |
int |
4 |
群组的ID |
领域对象协议
QQ面向对象设计的更多相关文章
- 【面向对象设计原则】之接口隔离原则(ISP)
接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...
- 【设计模式系列】之OO面向对象设计七大原则
1 概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2 七大OO面向对象设计 2.1 单一 ...
- 翻译 | The Principles of OOD 面向对象设计原则
本文首发于vivo互联网技术微信公众号 https://mp.weixin.qq.com/s/Q_pziBUhKRywafKeY2T7YQ 作者:Robert C. Martin 翻译:张硕 本文由来 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- UML类图与面向对象设计原则
1. 引言 从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...
- 面向对象设计之SRP(单一职责)原则
SRP设计原则面向对象类设计的第一个原则,最优先考虑的因素 一个类应该有且仅有一个职责.所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因 引起该类变化,其 ...
- day24:面向对象设计与面向对象编程、类和对象
一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...
- 【转】面向对象设计的SOLID原则
S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...
- 6. javacript高级程序设计-面向对象设计
1. 面向对象设计 1.1 理解对象 1.1.1 属性类型 (1). 数据属性:相当于对象的字段,包含一个数据值的位置,在这个位置可以读取和写入值.数据属性中有4个描述其行为的特性: l [[Conf ...
随机推荐
- Lua面向对象编程
Lua中的table就是一种对象,看以下一段简单的代码: , b = } , b = } local tb3 = tb1 if tb1 == tb2 then print("tb1 == t ...
- Hive tuning tips
1. limit Hive has a configuration property to enable sampling of source data for use with LIMIT: hiv ...
- 怎样用ZBrush快速雕刻皮肤纹理
今天的ZBrush教程我们将对利用基础笔刷制作出的“亡灵僵尸”头部模型进行皮肤纹理的处理,主要用到了Layers 3D图层和Alpha笔触类型添加皮肤纹理. 详细的视频教程地址可前往:http://w ...
- iOS使用Core Graphics和UIBezierPath绘画
通过UIView的子类的- (void)drawRect:(CGRect)rect 函数可用对视图进行重新绘画: 要重新绘画可以通过Core Graphics和UIBezierPath来实现. 1.通 ...
- 谷歌开源项目Google Preview Image Extractor(PIEX) (附上完整demo代码)
前天偶然看到谷歌开源项目中有一个近乎无人问津的项目Google Preview Image Extractor(PIEX) . 项目地址: https://github.com/google/piex ...
- Android配置----adb工具的使用
Adb(android debug bridge):android 调试桥,用于将本地的文件 push 到环境中,或者从手机环境中 pull 文件到本地. 一.ADB的主要功能: · 运行设备的she ...
- AutoIT删除Internet临时文件
搜集了几个超赞的方法: 1.删除临时文件 Temporary Internet Files:RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 2. 删 ...
- java 16 - 5 LinkedList模拟栈数据结构的集合
请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...
- 对比git rm和rm的使用区别
在这里说一下git rm和rm的区别,虽然觉得这个问题有点肤浅,但对于刚接触git不久的朋友来说还是有必要的. 用 git rm 来删除文件,同时还会将这个删除操作记录下来:用 rm 来删除文件,仅仅 ...
- Saltstack-自动化部署
Saltstack概述 Salt一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线, 使其可以 ...