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 ...
随机推荐
- 这一路走来,冷暖自知 (附算法demos)
最近半年多,除了“一键修图”算法之外我还做了其他什么算法? 1.实时单图HDR算法(颜色矫正,智能曝光) 2.多图曝光融合HDR算法(最高支持八百万像素左右) 3.模拟热能探测算法 4.防伪探测算法 ...
- 传统高斯模糊与优化算法(附完整C++代码)
高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次 ...
- 使用Unity3D的50个技巧:Unity3D最佳实践
翻译故事 原文:http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ 这篇技巧,我自己也在翻译, ...
- 创建自定义的Cocos2d-x场景
操作步骤 1.创建cocos2d-x工程 2.新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#define __SCENE1_H__ #i ...
- PYTHON FABRIC实现远程操作和部署
转载至:http://wklken.me/posts/2013/03/25/python-tool-fabric.html fabric title是开发,但是同时要干开发测试还有运维的活 (o(╯□ ...
- BIO、NIO与NIO.2的区别与联系
BIO.NIO.NIO.2之间的区别主要是通过同步/异步.阻塞/非阻塞来进行区分的 同步: 程序与操作系统进行交互的时候采取的是问答的形式 异步: 程序与操作系统取得连接后,操作系统会主动通知程序消息 ...
- ztree插件(JQuery Tree)
本次使用的ztree插件,基本上所有的需求都能满足,可谓功能强大. * [http://www.ztree.me/v3/api.php zTree v3.0 API 文档] * [http://www ...
- 【转】【Asp.Net】ASP.NET中自定义控件无法响应事件
在自定义服务器控件中增加事件处理程序,但代码运行时没有错误,按钮点击下去却没有反应.应该如何处理呢?(本例中,该自定义控件包括一个Button,和一个Label,我希望用户点击了这个Button后,改 ...
- Linux Linux程序练习十二(select实现QQ群聊)
//头文件--helper.h #ifndef _vzhang #define _vzhang #ifdef __cplusplus extern "C" { #endif #de ...
- C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲
//文件结构体FILE的理解以及缓冲区再讲 #include<stdio.h> #include<stdlib.h> //要点:文件结构 //struct _iobuf { / ...