学 JAVA 必然要学习网络通信socket,当我们了解了socket的通信原理后,想要写出一个健壮的socket模块还是很不容易的,scoket+线程+IO,我们使用最原始的代码去实现,往往写出的代码漏洞百出,那如何是好?今天给大家介绍一个强大的,可以实现大并发量的,scoket通信框架—— MINA。

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的TCP/UDP 应用程序开发、串口通讯程序。

Mina 的应用层:

一个设计成熟的开源框架,总是会仅可能的减少侵入性,并在整个项目中找到合适的位置,而不应对整个项目的构架设计产生过多的影响,图 1 就是 MINA 的应用层示意图。从图中和上节的 DEMO 中我们可以看到, MINA很好的把业务代码和底层的通信隔离了开来,我们要做的仅仅是建立好监听,然后写上我们需要实现的业务逻辑就OK 了。

MINA 的内部流程:

(1) IoService :这个接口在一个线程上负责套接字的建立,拥有自己的 Selector ,监听是否有连接被建立。

(2) IoProcessor :这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector ,这是与我们使用 JAVA NIO 编码时的一个不同之处,通常在 JAVA NIO 编码中,我们都是使用一个 Selector ,也就是不区分 IoService 与 IoProcessor 两个功能接口。另外, IoProcessor 也是 MINA 框架的核心组件之一 . 在 MINA 框架启动时,会用一个线程池来专门生成线程,来负责调用注册在 IoService 上的过滤器,并在过滤器链之后调用 IoHandler 。在默认情况 IoProcessor 会用N+1 个线程来轮流询问监视的端口是否有数据传送,其中 n 为 cpu 的内核个数。按一般的多线程设计概念来说,IoProcessor 的线程数是越多越好,但实际上并非如此,因为大家都知道, IO 的操作是非常占用资源的,所以项目中的 IoProcessor 的线程数应该根据实际需要来定,而这个数字可以在生成 IoAcceptor 对象时进行设定。 EgIoAcceptor acceptor = new NioSocketAcceptor( N );

(3.) IoFilter :这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤,甚至是在过滤器链中利用 AOP 写上权限控制。数据的编码( write 方向)与解码( read 方向)等功能,其中数据的 encode 与 decode 是最为重要的、也是您在使用 Mina 时最主要关注的地方。

(4.) IoHandler :这个接口负责编写业务逻辑,也就是接收、发送数据的地方。如果大家把业务处理写好,并写好业务接口,真正要用时,只需要在此处替换即可,再次见证了 MINA 分层的彻底。

其中 IoService 接口会专门起一个线程来轮询是否有新的连接产生,一旦有连接产生则通知 IoProcessor, 而IoProcessor 则起 n+1 个线程来检查连接是否有数据在上面读写。一旦有连接产生,并有数据读写,则通知 decode 或 encode ,进行报文的解码或编码,将处理后的报文再交给业务类进行业务处理。其中IoProcessor 是处理请求的分配,包括选择 Selector ,超时验证,状态记录等。总之这个类和 IoService 一起配合工作,封装了 NIO 底层的实现以及 MINA 框架内部的功能的支持 .

结合实例,并根据以上的图文讲解,我们可以很轻易的总结出利用 MINA 编程的几个大致步骤:

创建一个实现了 IoService 接口的类

设置一个实现了 IoFilter 接口的过滤器(如果有需要的情况下)

设置一个 IoHandler 接口实现的处理类,用于处理事件(必须)

对 IoService 绑定一个端口开始工作

注:这一点请特别注意,因 IoProcessor 也是相当于轮询机制,这导致在报文过长时,或其它原因导致报文不能一次传输完毕的情况下,必须保存同一连接 ( 在 MINA 中是以 IoSession 类生成的对象 ) 的上一次状态,这样才能截取到一个完成的报文,而这也是 decode( 编码器 ) 需要做的核心工作 。

文章来至:codexueyuan.com

转载于:https://blog.51cto.com/8584311/2091367

大并发量socket 通信框架相关推荐

  1. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-代码解析...

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍一文之中我们对AgileEAS.NET S ...

  2. rdkafka线程过多_我是如何处理大并发量订单处理的 KafKa部署总结

    今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为公司需要它. 网上已经有很多怎么用和用到哪的 ...

  3. .net3.5下的Socket通信框架

    .net3.5下的Socket通信框架 1:前言 写博客时间不短了但是一直不知道怎么开头.索性就开门见山吧. 这篇文章主要给大家介绍.net3.5下的Socket通信,主要从事件池,缓冲区以及协议三个 ...

  4. 大并发量,大数据量基于SSH应用程序架构有关问题

    首先介绍下情况,并发量最多可达到万级,应用程序架构是基于SSH的,系统级是通过Apache分发,集群配置.但是目前情况不理想,我对系统级架构都是在钻研期间,下面是自己查的总结,但还是不怎么理想,各位熟 ...

  5. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答...

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  6. SpringBoot内置Tomcat支持多大并发量和连接数

    SpringBoot内置Tomcat,再默认设置中,Tomcat的最大线程数是200,最大连接数是10000.支持的并发量是指连接数,200个线程如何处理10000条连接的? Tomcat有两种处理连 ...

  7. 为什么Redis是单线程?为什么能处理大并发量?(举例不错)

    一.Redis为什么是单线程 注意:redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程. 因为CPU不是Redis的瓶颈.Redis的瓶颈最有可能是 ...

  8. 大数据量下高并发同步的讲解(不看,保证你后悔!)

    偶然的机会在网上看到了这篇blog,觉得作者写得挺不错的(虽然自己并没有怎么看懂...),所以就转来跟大家分享分享吧~~~ 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发 ...

  9. 大数据量下高并发同步的讲解(不看,保证你后悔)

    对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研 ...

最新文章

  1. 机器人也需要拥有属于自己的性格
  2. 【强化学习】多臂老虎机——E_greedy、UCB、Gradient Bandit 算法 代码实现
  3. mysql数据库表迁移
  4. BDB (Berkeley DB)简要数据库(转载)
  5. django 1.8 官方文档翻译:13-3 日志
  6. 多线程的那点儿事(之优先级反转)
  7. 如何在Mac上用Script启动quicktime录制?
  8. 语言阿克曼函数_函数式的动态规划
  9. LeetCode【1051. 高度检查器】
  10. 「不看后悔一辈子」Python100个游戏大合集(1~15)
  11. Win7部署Web网站之IIs安装篇
  12. 【NLP】文本分类算法-基于字符级的无词嵌入双向循环神经网络(双向 GRU)
  13. 谁是史上最强-用爬虫分析IMDB TOP250电影数据
  14. 裸机搭建深度学习服务器,ubuntu ssh服务器,pytorch, tensorflow, paddle三种框架安装。以及各种避雷。
  15. Linux命令大全,从A到Z,2023年收藏大吉!
  16. 《MLB棒球创造营》:走近棒球运动·亚利桑那响尾蛇队
  17. 前端:时间( ISO)标准时间转换为时间戳
  18. 举个栗子!Tableau 技巧(202):用参数为图表设置开关按钮
  19. MYSQL—— TIME_TO_SEC函数与UNIX_TIMESTAMP函数区别
  20. 跨平台应用开发进阶(二十九) :uni-app 实现Android原生APP-云打包集成神策详细教程

热门文章

  1. spad dtof lidar车载IMX459更新系列五深度传感器的原理和特点
  2. 按上下限范围分组_分组排列显规律—浅析质量工具直方图
  3. 这样使用Node.js压缩PNG图片,效果高达75%
  4. 华硕TP500LB笔记本程序驱动下载
  5. Ecology8 ecology8流程表单常用js
  6. 浅谈县级融媒体中心运营利器之融媒体直播车
  7. 软件开发的六大阶段 (指针经典原创)
  8. 网红如何对抗MCN?
  9. android studio 阿里云镜像_Springboot工程制作镜像并推送到阿里云
  10. 基于stm32的指纹识别系统设计与系统