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

前言

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

网络模块

  • 从上图我们可以看出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. ASP.NET MVC实现layui富文本编辑器应用

    先看看视图层 在视图层,使用的是视图助手--HtmlHelper,代替我们网页中传统的表单标签元素,其中的m代表实体模型.通过视图助手,为我们生成id和name属性相同的textarea标签. 备注: ...

  2. (PHP)redis String(字符串)操作

    /** * * String操作 * 字符串操作 * */ //设置键值:成功返回true,否则返回false,键值不存在则新建,否则覆盖 $redis->set('string', 'hell ...

  3. 《H5+移动应用实战开发》已出版

    <H5+移动应用实战开发>终于出版了,最近在忙着Vue和Webpack相关的前端书籍写稿.本书面向的读者为:从后端转前端,或零基础开始学习移动端开发的人.前后端完全分离的开发方式越来越成为 ...

  4. 6、kvm克隆虚拟机

    kvm克隆有两种方法可以使用先暂停kvm虚拟机 virsh suspend privi-server 方法一:对虚拟机本身直接clone virt-clone -o privi-server -n p ...

  5. Command模式(命令设计模式)

    Command?? 把方法的调用用一个类的实例来承载,要管理工作的历史记录,创建这些方法执行的命令的集合,只需管理这些实例的集合即可,而且还可以随时再次执行过去的命令,或是将多个过去的命令整合为一个新 ...

  6. GUI的最终选择 Tkinter(四):Entry、Listbox、Scrollbar和Scale组件

    Entry组件 Entry组件就是平时所说的输入框.输入框是程序员用到的最多的一个程序,例如在输入账号和密码的时候需要提供两个输入框,用于接收密码的输入框还会有星号将实际输入的内容隐藏起来. Tkin ...

  7. vue——踩坑

    打包的时候,要记得改一下这个配置路径~ 教程:https://www.cnblogs.com/wanf/p/7871787.html

  8. Android中常用的几种加密

    1.数字摘要 是指通过算法将长数据变为短数据,通常用来标识数据的唯一性,是否被修改,常用的加密算法有md5和sha1两种,如Android的App签名也是用的这两种算法. md5具有不可逆性,也可用来 ...

  9. C# this索引器

  10. Oracle子查询和多表查询

    多表查询需要用到表的连接 连接可以分为:(自行百度) 交叉连接(数字逻辑的笛卡尔积,不做解释) 等值连接 例如:select * from t_a, t_b where t_a.xx = t_b.xx ...