通讯项目——仿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 

消息字节总长 包含消息头总长度

type 

byte 

消息类型

dest 

int 

消息目的地 消息发送给谁

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 

0:成功 1:账号错误 2:IP验证失败

 

5、好友列表消息体结构

字段

数据类型

长度

描述

listCount 

byte 

好友分组个数

ListCount 

listName 

Octet String 

10 

一个分组的名字

bodyCount 

byte 

本组内有多少个用户

组内的bodyCount个好友

bodyNum 

int 

组内一个好友的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 

服务器生成的群ID

15、查找在线用户消息

字段

数据类型

长度

描述

消息头长度

消息头中包含消息类型

16、查找在线用户应答消息体结构

字段

数据类型

长度

描述

userCount 

int 

用户数量

userCount个用户数据

nikeName 

Octet String 

10 

一个用户的昵称

QQNum 

int 

一个用户的QQ号码

如果有userCount个用户,后面的结构相同

17、添加好友请求消息体结构

字段

数据类型

长度

描述

QQNum 

int 

要添加的好友的QQ号码

18、添加好友应答消息体结构

字段

数据类型

长度

描述

QQNum 

int 

被添加的好友的QQ号码

nikeName 

Octet String 

10 

被添加的好友的昵称

19、服务器发送群组列表

字段

数据类型

长度

描述

GroupCount 

int 

组群数量

userCount个用户数据

GroupName 

Octet String 

16 

一个组群的名称

 

GNum 

int 

一个组群的ID

 

GMasterNum 

int 

群组的ID

如果有GrouopCount个组群,后面的结构相同

20、查找组群消息

字段

数据类型

长度

描述

消息头长度

消息头中包含消息类型

21、查找组群应答

字段

数据类型

长度

描述

GroupCount 

int 

组群数量

userCount个用户数据

GroupName 

Octet String 

16 

一个组群的名称

 

GNum 

int 

一个组群的ID

 

GMasterNum 

int 

群组的ID

如果有GrouopCount个组群,后面的结构相同

22、添加组群请求

字段

数据类型

长度

描述

GID 

int 

要添加的群的ID

23、添加组群应答

字段

数据类型

长度

描述

userCount个用户数据

GroupName 

Octet String 

16 

一个组群的名称

GNum 

int 

一个组群的ID

GMasterNum 

int 

群组的ID

 

领域对象协议

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

  1. 【面向对象设计原则】之接口隔离原则(ISP)

    接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...

  2. 【设计模式系列】之OO面向对象设计七大原则

    1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一 ...

  3. 翻译 | The Principles of OOD 面向对象设计原则

    本文首发于vivo互联网技术微信公众号 https://mp.weixin.qq.com/s/Q_pziBUhKRywafKeY2T7YQ 作者:Robert C. Martin 翻译:张硕 本文由来 ...

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

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  5. UML类图与面向对象设计原则

    1. 引言     从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...

  6. 面向对象设计之SRP(单一职责)原则

    SRP设计原则面向对象类设计的第一个原则,最优先考虑的因素 一个类应该有且仅有一个职责.所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因 引起该类变化,其 ...

  7. day24:面向对象设计与面向对象编程、类和对象

    一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...

  8. 【转】面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  9. 6. javacript高级程序设计-面向对象设计

    1. 面向对象设计 1.1 理解对象 1.1.1 属性类型 (1). 数据属性:相当于对象的字段,包含一个数据值的位置,在这个位置可以读取和写入值.数据属性中有4个描述其行为的特性: l [[Conf ...

随机推荐

  1. 内存流和null字节

    #include <stdio.h> #include <string.h> int main() { ]={}; FILE* fp = fmemopen(buf,," ...

  2. c++获取sqlite3数据库表中所有字段的方法

    常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 方法1:使用s ...

  3. selenium如何随机选取省份和城市的下拉框的值

    1.原始需求,选择省份后,相应的城市会自动加载 2.思路 a.获取下拉框的所有元素个数 b.随机点击0-元素个数之间的某个值 3.代码实现 Random random = new Random(); ...

  4. 深度优先搜索 codevs 1065 01字符串

    codevs 1065 01字符串  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 输出仅有0和1组成的长度为n的字符串,并且 ...

  5. 测试思考[持续更新ing]

    1.如何设计好的测试用例,提高测试覆盖率?提高测试效率? 2.如何展现测试成果? 3.如何编写专业化.优质的测试文档? 4.如何适时借助测试工具,测试一些重复性比较高的测试? 5.如何引入自动化测试? ...

  6. bzoj-2338 2338: [HNOI2011]数矩形(计算几何)

    题目链接: 2338: [HNOI2011]数矩形 Time Limit: 20 Sec  Memory Limit: 128 MB Description Input   Output 题意: 思路 ...

  7. 移动web页面使用的字体的思考

    前言 记得做PC端页面的时候,字体一般设置为微软雅黑,现在做起移动端页面来了,设计师们一般都还把字体设置为微软雅黑字体,但是做出来后,测试的时候发现页面中的字体不是微软雅黑,怎么办? 后来了解到的手机 ...

  8. HDU 4409 Family Name List --乱搞、LCA

    题意: 给出一些名字,名字间有父子关系,有三种操作: 1.按祖先到后代,兄弟间按字典序由小到大排序,然后输出 2.求某个节点的兄弟节点有多少个,包括自己(注意,根节点的兄弟节点是1) 3.求节点a和b ...

  9. a 标签中调用js的几种方法

    我们常用的在a标签中有点击事件: 1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问 ...

  10. 仙人掌(cactus)

    仙人掌(cactus) Time Limit:1000ms Memory Limit:64MB 题目描述 LYK 在冲刺清华集训(THUSC) !于是它开始研究仙人掌,它想来和你一起分享它最近研究的 ...