欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

前言

前面我们讲到《迷你微信》服务器端的主架构,现在我们来描述一下它的模块详细信息。

网络模块

  • 从上图我们可以看出Server类在开始时调用了ServerNetwork的开启连接接口,从而开启了整个服务器的连接。

  • 在ServerNetw的连接中,首先是打开了一个NIO(非阻塞式)的连接,连接开启后会添加入一个ProtocolCodecFilter(编码)的Filter,分别是MinaEncoder和MinaDecoder。

  • MinaEncoder负责在服务器向客户端发送数据时进行编码,将要发送的Java对象编码成byte数组进行发送.

  • MinaDecoder负责在服务器接收到客户端数据时进行解码,将接收到的byte数组解码成Java对象,传入逻辑层。

  • 在ProtocolCodecFilter之后,还有一个MyLogger的Filter,它将负责将MinaEncoder和MinaDecoder处理完的数据进行一次Log,保证每次服务器的收发都有记录(包括时间,客户端IP和内容)。

  • 在ServerNetwork(网络层)中,还有一个“验证重发”器,负责将发送失败的数据进行再次发送,若是一定回合内发送失败,则会被抛弃。

  • 在ServerNetwork(网络层)的发送数据接口有ServerModel(服务器Model)和Process Request(请求处理器)两个模块会调用到,其中ServerModel负责发送心跳包(验证客户端在线),而Process Request(请求处理器)用于处理客户端请求。

  • 在ServerNetwork(网络层)的接收数据接口会调用到ClientRequest_Dispatcher(客户端请求分发器),即将客户端请求传递给逻辑层。

服务器的Model模块

  • 从上图我们可以看出ServerModel类包含了连接中用户的信息以及其一系列方法。

  • clientUserIpTable和clientUserIpTable两个Hashtable指向相同的一系列用户信息类,其中clientUserIpTable是以客户端的IP作为Key,而clientUserIpTable是以用户的UserId作为Key,使用Hashtable的原因是在当前情况下这是所有数据结构中能够最快获取到CLientUser对象的类型。

  • 从上图我们可以看出Server类在开始时调用了ServerModel的初始化接口,从而初始化了两个Hashtable对象。

  • Logger对象负责在一些关键操作发生时进行日志的记录。

  • ServerNetwork对象调用的“添加ClientUser”接口是在一个新客户端用户连接上来时以客户端IP作为key,记录下用户信息。

  • ClientRequest_Dispatcher是处理客户端请求的一个模块,它在处理许多请求时需要调用“获取ClientUser”接口来获取ClientUser对象;他在用户登陆时需要调用“用户登陆”接口来向clientUserIpTable中添加对象引用和修改ClientUser的UserId值;在用户下线时需要调用“用户下线”接口来删除clientUserIpTable中指向对象的引用和修改对象的UserId值。

  • KeepAlive模块负责对clientUserIpTable表中已连接用户发送心跳包,若是发送失败,则将该客户端判定为掉线,并删除该ClientUser对象。

服务器的客户端请求处理模块

  • 从上图我们可以看出Process Request 模块中共有三个“客户端请求处理器”,他们都继承于Server_Processor(封装关于ServerModel和ServerNetwork的引用和使用)。

  • 当服务器拓展新的功能(处理新的客户端请求)时,可以直接在Process Request模块中添加“客户端请求处理器”并继承于Server_Processor即可。

  • ClientRequest_Dispatcher是客户端请求分发器,根据客户端请求的类型分配给不同的“客户端请求处理器”进行处理。

  • Process Request 模块中多数处理方法都需要对数据库进行数据请求或者数据更新,所以Process Request 模块有对Database模块的调用。

  • HibernateSessionFactory类中封装了Hibernate对数据库的处理包含HibernateSessionFactory和HibernateDataOperation两个类。

  • ServerModel_Chatting类中包含了对发送聊天消息的各种操作的封装和对聊天消息的临时存储。

聊天Model模块

  • 这个模块是属于Process Request下Server_Chatting的一个子模块,它负责发送聊天消息。

  • 当Server_Chatting调用ServerModel_Chatting的“发送聊天消息”接口时,这个模块会进行判断,先从ServerModel中寻找ClientUser对象,校验接受者是否在线,如果在线,便通过调用ServerNetwork的接口进行发送;当接收者不在线时,将存入ChattingHashtable表中,等待用户上线。

  • ServerModelChatting模块监听“用户登陆”消息,一旦接收到这个消息,便会调用“发送聊天消息”的方法,将该用户所有未接受的消息全部发过去。

数据库模块

  • 从上图我们可以看出数据模块只由Process Request来调用,并对所有数据库模块的所有开放接口都有调用过。

  • HibernateSessionFactory模块负责管理Hibernate与MySQL的连接,提供“获取Session”接口和“提交Session”接口,对数据库的修改必须先获取Session,在修改完后提交,才能生效。

  • HibernateDataOperation对数据库的增删改查行为进行了封装,其中每个方法都调用了HibernateSessionFactory的“获取Session”接口和“提交Session”接口。

后话

在这个服务器的架构中,功能的拓展可以通过在Process Request 模块里面进行添加,然后从ClientRequest_Disptcher调用过去就可以了而更加复杂的功能拓展,可以添加观察者模式或者消息模式来实现,前面章节我们已经简单的论述,这里就不在多说了。

欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:10.项目介绍之架构(2)的更多相关文章

  1. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...

  2. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 <迷你微信>服务器端是使用Java语言,Mina框架编写的,一个良好的架构关系到后期迭代的方便程度 ...

  3. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...

  4. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议

    欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...

  5. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter——LoggingFilter (转)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 LoggingFilter 接下来,使我们对Filter介绍的最后一个——LoggingFilter. 与Proto ...

  6. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:6.技术简介之Protobuf

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 protocolbuffer(以下简称Protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平 ...

  7. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate

    目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...

  8. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Apache MINA(Multipurpose Infrastructure for Network Applic ...

  9. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...

随机推荐

  1. 使用python ftplib包递归下载文件夹及文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-06-11 09:35:49 # @Author : Yaheng Wang ...

  2. C习题练习

    #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> //比较俩个数的大小 //int max(int a, int b) {// int t ...

  3. jQuery之ajax() 参数

  4. es6- Generator函数实现长轮询

    1.Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. 语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态.形式上,Gene ...

  5. 洛谷P1098 字符串的展开

    P1098 字符串的展开 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输 ...

  6. 数组API(2)

    ES5中数组新增API: 1. indexOf 作用:检测当前数据是否在数组中存在: 特点:如果存在返回相对应的下标,如果不存在则返回-1: 如果数组中存在多个需要判断的这个数据,则返回最近的这个数据 ...

  7. 唯快不破:Web 应用的 13 个优化步骤

    时过境迁,Web 应用比以往任何时候都更具交互性.搞定性能可以帮助你极大地改善终端用户的体验.阅读以下的技巧并学以致用,看看哪些可以用来改善延迟,渲染时间以及整体性能吧! 更快的 Web 应用 优化 ...

  8. LightOJ 1336 - Sigma Function

    原题链接 基础数论中很经典的一道题 题意 给出了σ(n)的计算公式,让你找出整数1-n中有多少对应σ(n)的值是偶数. 思路 观察σ(n)的公式发现,每一个乘项都是 (piei+1 - 1) / (p ...

  9. std::ref() 与 &

    引言 之前因为调整样式把博客园的样式毁了,所以一直在自己的另一个博客上更新,有兴趣的可以去观望一下:http://blog.yunlambert.top/最近还是把博客园拾起来吧..... 最近看到一 ...

  10. 外键约束 foreign key

    外键约束 :保持数据一致性,完整性实现一对多关系.外键必须关联到键上面去,一般情况是,关联到另一张表的主键 (因为一个表只存一类信息.用外键来做参照,保证数据的一致性,可以减少数据冗余) ##表acr ...