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

前言

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

网络模块

  • 从上图我们可以看出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. SQL查询 若为空显示默认值

    COALESCE(a.end_,now()) SELECT COALESCE(NULL,NULL,3,4,5) FROM

  2. 【mysql存储引擎】

    看你的mysql现在已提供什么存储引擎: mysql> show engines;   看你的mysql当前默认的存储引擎: mysql> show variables like '%st ...

  3. 【Android-stdio-appdemo搭建记录】

    1-如何删除存在的工程 2-创建Android项目 next设置app兼容最低版本:api15--android 4.0以上 创建活动页面 设置活动页面的名称 创建成功项目以后会有最基本的layout ...

  4. Boost Python学习笔记(四)

    你将学到什么 在Python中调用C++代码时的传参问题 基础类型 Python的字符串是常量,所以C++函数参数中的std::string &必须为const 修改源文件(main.cpp) ...

  5. SNAT端口转发配置

    需求说明 在只有外网地址的机器上也能正常访问内网地址 配置过程 环境网络信息 网络名称 网络地址 外网 192.168.200.0/24 (网关:192.168.200.251) 内网 92.0.0. ...

  6. vue -- 项目调试

    方式1:vue-devtools插件 vue-devtools是一款基于chrome游览器的插件,用于调试vue应用,这可以极大地提高我们的调试效率. 使用步骤 1. 到github下载:https: ...

  7. Java实例——基于jsoup的简单爬虫实现(从智联获取工作信息)

    这几天在学习Java解析xml,突然想到Dom能不能解析html,结果试了半天行不通,然后就去查了一些资料,发现很多人都在用Jsoup解析html文件,然后研究了一下,写了一个简单的实例,感觉还有很多 ...

  8. 【转】vs发布msi程序详解

    源地址:http://wenku.baidu.com/link?url=MV1Mf7IukCZ0cab8AzXQoQ3MAXeUAHGz5b2IuUL4Kw-hCI90ZyBKXwKeQA3t3-SV ...

  9. burpsuite 抓HTTPS数据包

    抓HTTPS数据包 导出保存为cer证书文件,导入到受信任的根证书颁发机构 设置代理服务器与burp中proxy listeners保持一致 设置目标url 抓包 可用repeater发请求

  10. 洛谷P1772 [ZJOI2006]物流运输

    P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...