通讯项目——仿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. C和CPP关于条件运算符的区别

    条件运算符形式: cond ? expr1 : expr2; 在C语言中执行过程是: 先对cond求值,值为真返回expr1的值,否则返回expr2的值.(右值) gcc测试结果: 在Cpp中如果两个 ...

  2. [转]jQuery Popup Login and Contact Form

    本文转自:http://www.formget.com/jquery-popup-form/ Pop up forms are the smart way to present your site. ...

  3. 【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)

    1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目“GameSurfaceView”,首先自定义一个类"MySurfac ...

  4. 谷歌开源项目Google Preview Image Extractor(PIEX) (附上完整demo代码)

    前天偶然看到谷歌开源项目中有一个近乎无人问津的项目Google Preview Image Extractor(PIEX) . 项目地址: https://github.com/google/piex ...

  5. ZOJ 3232 It's not Floyd Algorithm --强连通分量+Floyd

    题意:给你一个传递闭包的矩阵,mp[u][v] = 1表示u可以到达v,为0代表不可到达,问你至少需要多少条边组成的传递闭包符合这个矩阵给出的关系 分析:考虑一个强连通分量,如果这个分量有n个节点,那 ...

  6. UVA 11992 Fast Matrix Operations (二维线段树)

    解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...

  7. Google play billing(Google play 内支付) 上篇

    写在前面: 最近Google貌似又被全面封杀了,幸好在此之前,把Google play billing弄完了,现在写篇 博客来做下记录.这篇博客一是自己做个记录,二是帮助其他有需要的人.因为现在基本登 ...

  8. DoTween(HOTween V2) 教程

    DoTween资料 官方网站:http://dotween.demigiant.com/ 下载地址:http://dotween.demigiant.com/download.php 快速开始:htt ...

  9. linux下查找某个目录下包含某个字符串的文件

    有时候要找一些字符串,但是又不知道在哪个文件,只记得一些字符串 那么如何在linux下寻找包含某段文字的文件呢? 强大的find命令可以帮你完成不可能的任务. 比如我只记得我的程序里包含唯一的字符串“ ...

  10. java 16-2 ArrayList的练习2

      需求:去除集合中自定义对象的重复值(对象的成员变量值都相同 注意: 我们按照和字符串一样的操作,发现出问题了. 为什么呢? 我们必须思考哪里会出问题? 通过简单的分析,我们知道问题出现在了判断上. ...