【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:10.项目介绍之架构(2)
前言
前面我们讲到《迷你微信》服务器端的主架构,现在我们来描述一下它的模块详细信息。
网络模块

从上图我们可以看出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)的更多相关文章
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 <迷你微信>服务器端是使用Java语言,Mina框架编写的,一个良好的架构关系到后期迭代的方便程度 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议
欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter——LoggingFilter (转)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 LoggingFilter 接下来,使我们对Filter介绍的最后一个——LoggingFilter. 与Proto ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:6.技术简介之Protobuf
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 protocolbuffer(以下简称Protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate
目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Apache MINA(Multipurpose Infrastructure for Network Applic ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
随机推荐
- Unix Tutorial Four
4.1 wildcards 通配符 * 通配符,配对1个或以上字符 ?通配符,只配对1个 4.2 Filename conventions 文件名约定 注意: 1. 目录是特殊的文件,故文件名的命名规 ...
- go语言实战教程:实战项目资源导入和项目框架搭建
从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...
- [Xcode 实际操作]四、常用控件-(4)UILabel文本标签的自动换行
目录:[Swift]Xcode实际操作 本文将演示标签控件的换行功能, 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class Vie ...
- Hibernate的优化方案
使用参数绑定 使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用生成好的执行计划,这样做节省CPU时间和内存. 避免SQL注入. 尽量少使用NOT 如果where子句中包含not关键 ...
- kuangbin专题十二 HDU1029 Ignatius and the Princess IV (水题)
Ignatius and the Princess IV Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32767 K ( ...
- thinkphp5实现文章上一篇,下一篇
写在控制器 //列表是按照根据id降序排列的,所以上一篇 $prv=Db::table('qy_article')->where('at_id','>',$at_id)->where ...
- Hexo瞎折腾系列(9) - 网页标题崩溃特效
前言 本系列的所有修改均基于本系列第一篇中的新增文件(譬如custom.js),请先自行阅读Hexo瞎折腾系列(1) - 准备工作与简单美化:并按照文章所说自行修改代码或文件. 为网页添加标题崩溃特效 ...
- jquery json实现省市级级联
java后台程序: import java.util.HashMap;import java.util.List;import java.util.Map; import javax.servlet. ...
- 一些有关PyCharm使用总结
目前在这里,你能看见 license server Python版本配置 添加另外版本的Python 设置字体大小 关于编码 关于模版 安装好之后,第一个问题就是 license server 问题, ...
- spring容器中的beanName
1. 一个类实现多个接口 如下图中的JobService.java, 此时这个beanName=jobService, 没有包名,类名字首字母小写 可以使用下面三种方式获得这个bean IProce ...
