通讯项目——仿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. 这一路走来,冷暖自知 (附算法demos)

    最近半年多,除了“一键修图”算法之外我还做了其他什么算法? 1.实时单图HDR算法(颜色矫正,智能曝光) 2.多图曝光融合HDR算法(最高支持八百万像素左右) 3.模拟热能探测算法 4.防伪探测算法 ...

  2. 传统高斯模糊与优化算法(附完整C++代码)

    高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次 ...

  3. 使用Unity3D的50个技巧:Unity3D最佳实践

    翻译故事 原文:http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ 这篇技巧,我自己也在翻译, ...

  4. 创建自定义的Cocos2d-x场景

    操作步骤 1.创建cocos2d-x工程 2.新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#define __SCENE1_H__ #i ...

  5. PYTHON FABRIC实现远程操作和部署

    转载至:http://wklken.me/posts/2013/03/25/python-tool-fabric.html fabric title是开发,但是同时要干开发测试还有运维的活 (o(╯□ ...

  6. BIO、NIO与NIO.2的区别与联系

    BIO.NIO.NIO.2之间的区别主要是通过同步/异步.阻塞/非阻塞来进行区分的 同步: 程序与操作系统进行交互的时候采取的是问答的形式 异步: 程序与操作系统取得连接后,操作系统会主动通知程序消息 ...

  7. ztree插件(JQuery Tree)

    本次使用的ztree插件,基本上所有的需求都能满足,可谓功能强大. * [http://www.ztree.me/v3/api.php zTree v3.0 API 文档] * [http://www ...

  8. 【转】【Asp.Net】ASP.NET中自定义控件无法响应事件

    在自定义服务器控件中增加事件处理程序,但代码运行时没有错误,按钮点击下去却没有反应.应该如何处理呢?(本例中,该自定义控件包括一个Button,和一个Label,我希望用户点击了这个Button后,改 ...

  9. Linux Linux程序练习十二(select实现QQ群聊)

    //头文件--helper.h #ifndef _vzhang #define _vzhang #ifdef __cplusplus extern "C" { #endif #de ...

  10. C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲

    //文件结构体FILE的理解以及缓冲区再讲 #include<stdio.h> #include<stdlib.h> //要点:文件结构 //struct _iobuf { / ...