zoukankan      html  css  js  c++  java
  • 自主研发异步通信框架Minma(支持长连接和短连接)

    Minma是英文Minma Is Not Mina的简称

    该框架采用Java NIO的核心技术,实现了基于事件驱动的多线程异步通信框架,支持常见的长连接(腾讯QQ)短连接(http通信)

    对于开发人员而言,所有的底层技术都是透明的,开发人员仅仅只需要处理业务逻辑,把复杂的NIO简化成了类似Java Swing事件驱动式的编程。

    长连接实例图

    具体通信流程
    1.客户端连接服务端,服务端通过Selector接收到连接请求,将其socketChannel通道保存到通道集合,并触发客户端连接事件
    2.客户端发送数据包请求到服务端,服务端将请求的SelectionKey压入“读消息生产者队列”,立即进入下一批Select
    3.读消息消费者线程池中派遣一个就绪线程从客户端读取数据包DataPacket,并触发onReaded事件
    4.开发人员在onReaded事件编写逻辑代码,并且决定读入的数据包的去向(返回给客户端,还是结束)
    5.若在onReaded事件里,开发人员决定数据包要返回到客户端,则将该SelectionKey压入写消息生产者队列
    6.写消息消费者线程池中派遣一个就绪线程,将数据包写到客户端,并触发onWrited事件
     
    这就完成了长连接的一次通信,在所有的通信中都是异步的,没有出现阻塞的地方
     
    若要深入了解,请先了解Java NIO技术
    短连接实例
    和长连接相比,短连接唯一的区别就是,不需要保存客户端的通信通道
    通信的节奏为:连接->读入->计算、逻辑->返回客户端->断开连接
     
    1.客户端连接服务端,服务端通过Selector接收到连接请求
    2.客户端发送数据包请求到服务端,服务端将请求的SelectionKey压入“读消息生产者队列”,立即进入下一批Select
    3.读消息消费者线程池中派遣一个就绪线程从客户端读取数据包DataPacket,并触发onReaded事件
    4.开发人员在onReaded事件编写逻辑代码,读入的数据包的去向始终是客户端
    5.若在onReaded事件里,开发人员决定数据包要返回到客户端,则将该SelectionKey压入写消息生产者队列
    6.写消息消费者线程池中派遣一个就绪线程,将数据包写到客户端,并触发onWrited事件
    7.断开与客户端连接,触发onClientClose事件
     
     若要深入了解,请先了解Java NIO技术
    下面分别写2个Demo来看看
    首先是长连接Demo 
     首先在classpath创建一个配置文件minma.xml

    服务端代码

     客户端代码

     运行结果
    服务端

    下面看看短连接Demo
    服务端代码

    客户端代码

    运行结果

    服务端

    客户端

    可以看到框架用起来还是非常方便的,开发人员完全看不到底层的通信,仅仅只需要编写事件逻辑代码即可。

  • 相关阅读:
    JAVA读取PROPERTIES文件方式一
    JAVA时间工具类用法
    webservice
    SPRING+JPA+Hibernate配置方法
    Spring Boot,Spring Data JPA多数据源支持配置
    mybatis---实现关联表查询
    CXF WebService整合SpringMVC的maven项目
    ISO8583报文协议
    服务器换了一组硬盘后,读取不到硬盘数据,开不了机
    Ubuntu server12.04安装JDK+Tomcat+mysql
  • 原文地址:https://www.cnblogs.com/austinspark-jessylu/p/7324923.html
Copyright © 2011-2022 走看看