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

?

领域对象协议

时间: 2024-10-13 07:48:31

QQ面向对象设计的相关文章

Java程序员应当知道的10个面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的分析和设计上面.学习面向对象编程像"抽象"."封装"."多态"."继承" 等基础知识是重要的,但同时为了创建简洁.模块化的设计,了解这些设计原则也同等重要.我经常看到不同经验水平的java程序员,他们有的不知

7种面向对象设计的强大之处

凭什么要用面向对象来编程,不用是否可以?今天我们通过讲这么几个设计原则来说明为什么要用面向对象,它的好处在哪里. 一.单一职责原则: 全称:“Single-Responsibility Principle”面向对象设计 说明:就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因.所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个,而不是两个或更多.也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了.因为职责是变化的一个轴线,当需求

Java程序员应该了解的10个面向对象设计原则

面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator.Observer这样的设计模式,而不重视面向对象的分析和设计.甚至还有经验丰富的Java程序员没有听说过OOPS和SOLID设计原则,他们根本不知道设计原则的好处,也不知道如何依照这些原则来进行编程. 众所周知,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计.查看Ap

设计模式2 面向对象设计原则

面向对象设计原则  原则的目的 面向对象设计原创表  单一职责原则案例 开闭原则 案例 依赖倒转原则 案例 面向对象设计原则  对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一.在面向对象设计中,可维护性的复用是以设计原则为基础的.每一个原则都蕴含一些面向对象设计的思想,可以从不同的角度提升一个软件结构的设计水平.  面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含

面向对象设计原则

七大原则:开闭原则.里氏代换原则.依赖倒转原则.合成/聚合复用原则.迪米特法则.接口隔离原则,单一职责原则. 开闭原则是面向对象的可复用的基石.其他六种原则是手段和工具. 各规则详细(本部分为转载) http://kb.cnblogs.com/page/214010/ 正如牛顿三大定律在经典力学中的位置一样,“开-闭”原则(Open-Closed Principle)是面向对象的可复用设计(Object Oriented Design或OOD)的基石.其他设计原则(里氏代换原则.依赖倒转原则.合

面向对象设计的SOLID原则

S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility Principle 单一责任原则 OCP The Open Closed Principle  开放封闭原则 LSP The Liskov Substitution Principle 里氏替换原则 DIP The Dependency Inversion Principle 依赖倒置原则 ISP The

软件工程概论第八章--面向对象设计

面向对象设计主要讲设计的概念.软件体系结构.系统设计.详细设计.应用设计模式.用户界面设计和设计文档等方面知识,面向对象的设计是面向对象技术中比较重要的阶段. 设计的概念中讲了设计活动和设计原则,设计是一个建模活动,此活动能实现从需求分析到软件实现间的跨越.设计原则主要有模块化.耦合度和内聚性和复用性,模块化可以使复杂的系统简化,耦合度和内聚性分别是子系统间的关联程度和系统内部的相关程度,降低耦合性提高内聚性.复用性利用以开发的软件元素生成新的软件系统. 软件体系结构主要有仓库体系结构,分层体系

【设计模式】#001 面向对象设计的八个原则

1.对于面向对象的软件系统设计来说,在支持可维护性的同事,需要提高系统的可复用性 2.软件的复用可以提高软件的开发效率,提高软件的质量,节约开发成本,恰当的复用还可以改善系统的可维护性 3.面向对象设计简化成三条 3.1 封装变化点 3.2 对接口编程 3.3 多使用组合,少使用继承 点击查看大图:

面向对象设计——“泛型”的起步

泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能.泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候.例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险. --MSDN 我的计算机是以Visual Basic 6.0拉开帷幕的,让我印象比较深的是两个排序:选择排序和冒泡排序.当然本