- 浏览: 554871 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
hdblocal_:
为什么messageReceived之后,再encode,有点 ...
MINA框架使用总结 -
andey007518:
MINA框架使用总结 -
ymm8505:
我自己的理解 CopyOnWriteArrayList 这个 ...
ArrayList遍历的同时删除 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Eclipse快捷键-方便查找 -
netwelfare:
文章讲解的不够详细,ArrayList在遍历的同时如果去删除或 ...
ArrayList遍历的同时删除
参考:http://xinsync.xju.edu.cn/index.php/archives/category/prglang/java/mina
简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。
下面这个start方法用来初始化MINA:
private void start(int port, WebContext ctx) throws IOException, InstantiationException , IllegalAccessException, ClassNotFoundException { //初始化Acceptor NioSocketAcceptor acceptor = new NioSocketAcceptor(5); java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(1500);//建立线程池 //加入过滤器(Filter)到Acceptor acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool)); acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new WebDecoder(),new WebEncoder())); LoggingFilter filter = new LoggingFilter(); filter.setExceptionCaughtLogLevel(LogLevel.DEBUG); filter.setMessageReceivedLogLevel(LogLevel.DEBUG); filter.setMessageSentLogLevel(LogLevel.DEBUG); filter.setSessionClosedLogLevel(LogLevel.DEBUG); filter.setSessionCreatedLogLevel(LogLevel.DEBUG); filter.setSessionIdleLogLevel(LogLevel.DEBUG); filter.setSessionOpenedLogLevel(LogLevel.DEBUG); acceptor.getFilterChain().addLast("logger", filter); acceptor.setReuseAddress(true);//设置的是主服务监听的端口可以重用 acceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用 acceptor.getSessionConfig().setReceiveBufferSize(1024);//设置输入缓冲区的大小 acceptor.getSessionConfig().setSendBufferSize(10240);//设置输出缓冲区的大小 //设置为非延迟发送,为true则不组装成大包发送,收到东西马上发出 acceptor.getSessionConfig().setTcpNoDelay(true); //设置主服务监听端口的监听队列的最大值为100,如果当前已经有100个连接,再新的连接来将被服务器拒绝 acceptor.setBacklog(100); acceptor.setDefaultLocalAddress(new InetSocketAddress(port)); //加入处理器(Handler)到Acceptor acceptor.setHandler(new WebHandler()); acceptor.bind(); }
NioSocketAcceptor是MINA的适配器,一切都是从这里开始的。MINA中有个过滤器和处理器的概念,过滤器用来过滤数据,处理器用来处理数据。具体来说MINA的处理模型就是request->过滤器A->过滤器B->处理器->过滤器B->过滤器A->response,这里的request和response类似serlvet的request和response。
acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool)); //加入一个线程池到适配器,这里用的是jdk自带的线程池
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new WebDecoder(),new WebEncoder())); //这里是处理逻辑的关键部位,请求的处理都是在WebDecoder类和WebEncoder类中处理,可以明显从命名上看出来一个是用来解码,另一个是用来编码,requet过来后先进入WebDecoder类(实现了ProtocolDecoder接口)进行解码处理,这里可以加入自己的逻辑把传进来的流解码成自己需要的信息。而WebEncoder类(实现了ProtocolEncoder接口)是进行编码,在这个类里面加入自己的逻辑把处理后的信息组装发送给客户端(response)。而在解码和编码过程中WebHandler(扩展了IoHandlerAdapter抽象类)起到了处理器的作用。 //request->WebDecoder->WebHandler->WebEncode->response
现在详细描述一下request->WebDecoder->WebHandler->WebEncode->response的过程:
客户端发送一个请求到MINA服务器,这里相当于来了一个requet。请求首先来到
WebDecoder类(实现了ProtocolDecoder接口)中的 boolean decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception{}方法 /* 参数in:用户请求信息全存在这里,读数据就从in这里读。 参数out:用来输出处理后的数据到Filter的下一个过滤器,如果没有过滤器了就输出到WebHandler,这里有点和 servelt的过滤器类似。利用out.write(Object object);这个函数可以把数据传到下一个Filter。我们可以自己定义 一个对象,我们假设为Request,用它来传递消息,那末这里就可以写成out.write(new RequsetMessage()); 如果这个方法返回false,就是说当前逻辑包还没接收完(也就是当前的IoBuffer并没有包含足够的数据),需要再次 执行decode方法(再次获取新的IoBuffer),用来获取足够的数据。如果返回值为true就表示可以不执行decode方 法了,但是要激活handler方法,必须要调用out.write方法。 public class RequestMessage{}//这里什么也不做 */
然后到
WebHandler(扩展了IoHandlerAdapter抽象类)中的 void messageReceived(IoSession session, Object message) throws Exception{}方法 WriteFuture future = session.write(response);//session中必须加入这个代码,才会激活encode方法 future.addListener(IoFutureListener.CLOSE);//这个的作用是发送完毕后关闭连接,加了就是短连接,不然是长连接 IoFutureListener里面有个operationComplete(IoFuture future)方法,当流发送完成之后才调用这个方法。 /* 参数message:用来获取Filter传递过来的对象.对应代码RequestMessage request = (RequestMessage) message; 参数session:用来发送数据到Filter.对应代码session.write(new ResponseMessage()); public class ResponseMessage{}//这里什么也不做,假设存放处理后的数据 注意:对于一个MINA程序而言,对于WebHandler类只生成一个对象,所以要考虑线程安全问题 */
然后到
WebEncoder类(实现了ProtocolEncoder接口)中的 boolean encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception{} 方法 /* 参数message:用来获取上一个Filter节点的数据或者处理器的数据(如果这个过滤器为最靠近处理器的那个) ResponseMessage response = (ResponseMessage)message; 参数out:用来输出数据到下一个Filter节点过或者到客户端,用out.write(Object encodedMessage)把数据发送 出去,但是要注意的是,如果这个Filter下一个节点如果是客户端的话,那个这个encodedMessage数据必须为 IoBuffer类型的,可以利用IoBuffer.wrap(byte[] byteArray)这个方法来格式化输出数据 */
- NIO_TEST.rar (13.9 KB)
- 描述: 阻塞和非阻塞io的简单通信程序,自己写的(写的不好)放这里做个备份
- 下载次数: 1486
评论
6 楼
hdblocal_
2018-08-04
为什么messageReceived之后,再encode,有点没看懂这种操作...
5 楼
andey007518
2018-04-01
4 楼
coolhorse168
2015-02-28
多谢分享,
3 楼
alaa90
2013-03-26
收下了
2 楼
hotsmile
2012-11-16
mark 一下!!!!!!!!!!!!!
1 楼
chengen168
2012-05-27
MARK写的不错~~
发表评论
-
为何在使用CMS gc算法时会出现连续两次full gc
2011-09-01 11:04 4976现象: jstat -gcutil pid 1000观察到 ... -
配置filter拦截forward之类的内部转发
2011-02-18 17:19 6032在servlet-2.3中,Filter会过滤一切请求,包括服 ... -
request.getRequestURI 与request.getServletPath() 区别
2011-02-16 19:38 7850路径:resin/webapps/my_proj/test/r ... -
ConcurrentHashMap中的remove方法的bug
2010-04-30 11:48 5824最近研究了一下 ConcurrentHashMap中源码发现j ... -
搭建Android开发环境
2010-04-05 23:22 1553在eclipse上安装Android 1.安装eclipse ... -
IoServer源代码阅读笔记
2009-08-23 21:57 2157NIO:写事件要尽量早的被注销. 1,IOServer用一 ... -
一个webapp目录下部署多个web应用
2009-08-21 10:34 2163在同一个resin下的webapp目录部署多个web应用,发现 ... -
java 的深度克隆
2009-07-01 20:07 1811只有实现了cloneable接口才算是真正的深度克隆. 在复 ... -
try finally return
2009-03-20 19:21 1259class Entry { ... -
String和==号的问题
2009-03-09 19:45 1238String name = "you" ... -
Bit数组
2009-01-20 18:56 2904public class BitArray{//用byte数组 ... -
关于Java占用内存的研究 (转载请注明作者zms)
2009-01-20 15:28 3012版权声明:转载时请以 ... -
几种通讯协议的比较
2009-01-20 15:26 5357一、综述 本文比较了RMI ... -
java基础知识总结
2009-01-06 00:50 2860http://wiki.caucho.com/Hessian_ ... -
Java基础-关于session的详细解释
2008-12-01 23:49 1390一、术语session 在我的经验里,session这个词 ... -
关于大量缓存对象回收的思考
2008-12-01 15:34 2672前几天面试,被问到了一个问题,如果当前有数亿条记录,但是缓存最 ... -
java 快速排序demo
2008-11-29 19:52 2067快速排序算法思想如下,先选取一个元素作为基准,然后根据这个基准 ... -
java 实现简单的文件拷贝
2008-11-26 17:36 6278昨天面试,面试官要我在黑板上写个java文件复制的代码,但是一 ... -
HashMap的遍历效率讨论
2008-11-26 11:31 3695经常遇到对HashMap中的key和value值对的遍历操作 ... -
Java ArrayList 实现
2008-11-25 23:02 3760ArrayList是List接口的一个可变长数组实现。实现了 ...
相关推荐
mina 框架使用总结 mina 框架是对 Java 的 NIO 包的一个封装,简化了 NIO 程序开发的难度,封装了很多底层的细节,使开发者把精力集中到业务逻辑上来。下面是对 mina 框架使用的总结。 1. MINA 框架概述 MINA ...
在MINA框架中,`NioSocketAcceptor` 是一个核心组件,它用于监听和接受来自客户端的连接请求。在提供的代码片段中,`start` 方法初始化了一个 `NioSocketAcceptor` 实例,并设置了相关的配置: 1. 线程池:`...
总结来说,本教程将引导你从理论到实践,掌握Java NIO的基本原理,理解Mina框架的使用,以及如何在SpringBoot环境中整合Mina实现高效的网络通信。通过这些知识的学习,你将具备开发高并发、高性能网络应用的能力。
以下是一些关于如何使用MiNA框架进行开发的示例: ##### 1. 服务端演示 服务端的应用程序通常是接收来自客户端请求的服务方。在MiNA框架中,服务端的搭建相对简单,可以通过以下几个步骤实现: - **创建...
Mina框架允许配置不同的端口,以确保每个连接使用独立的通信通道,从而避免端口占用冲突。 5. **MinaClientDemo项目** 提供的`MinaClientDemo`示例项目可能包含了以下部分: - `MinaClient`:客户端实现,包含...
总结来说,Mina框架是一个强大的工具,用于构建高性能的网络服务,而SLF4J则提供了灵活的日志记录解决方案。通过下载的“Mina完整架包”,开发者可以获得所有必要的组件,开始创建自己的网络应用程序。
3. **MINA使用手记[1] .shtml** 和 **MINA框架使用总结 .shtml**:这些可能是个人或团队在使用MINA过程中的笔记和总结,可能包含了实践中的技巧、问题解决策略以及最佳实践。 4. **Apache MINA 线程模型配置 .shtml...
总结起来,Android平台上的MINA框架提供了一套强大的网络通信解决方案,能够帮助开发者快速、高效地构建网络应用。在实际使用中,我们需要关注中文乱码问题的解决、保持Socket连接的稳定性和可靠性,以及如何在...
总结起来,Apache Mina是一个强大且灵活的网络通信框架,通过其事件驱动和异步IO模型,简化了网络应用的开发过程。IoService、IoProcessor、IoFilter和IoHandler这四个关键接口协同工作,确保了数据的高效传输和业务...
### Mina框架研究与实现 #### 引言 在当今高度网络化的世界中,服务器端程序面临着前所未有的挑战,特别是当需要同时处理成百上千的客户端连接时。这不仅要求服务器具备高性能,还必须保证高可用性。Mina框架正是...
- **MINA使用手记[1] .shtml**和**MINA框架使用总结 .shtml**:这两篇可能是作者的经验分享,可能涵盖了在实际项目中遇到的问题、解决方案以及最佳实践。 - **Apache MINA 线程模型配置 .shtml**:这部分内容可能...
总结,Mina2作为一个强大的网络通信框架,为企业级的网络应用提供了高效、灵活的解决方案。通过理解其核心概念,掌握使用步骤,并结合实例教程,开发者能够更好地利用Mina2开发自己的网络应用。
总结,MINA框架的自定义解编码器功能为我们提供了灵活的数据处理方式,通过定制解编码器,我们可以更好地适应各种网络协议和业务需求。在实践中,我们需要充分理解协议格式,合理设计解编码流程,以实现高效且可靠的...
总结来说,MINA框架提供了NIO的高级抽象,使得开发者可以通过简单的API实现复杂网络服务,同时保持高性能和可扩展性。通过使用过滤器链和自定义处理器,MINA允许开发者以模块化的方式处理网络通信,从而专注于业务...
总结起来,"坐席通讯监控软件"采用Mina框架,利用其非阻塞I/O、事件驱动和高度可扩展的特性,构建了一个高效、可靠的客户端通信系统。而"举手终端"则可能是这个系统中的一个重要组成部分,用于实现用户交互和信息...
# Mina框架详解 ## 一、Mina框架概述 Mina框架,全称为Apache Mina Server,是一款基于Java的高效、可扩展性强大的网络通信应用框架。它主要支持TCP/IP与UDP/IP协议栈,同时也提供了序列化服务、虚拟机管道通信等...
总结来说,MINA框架简化了Java网络编程,提供了高性能的异步I/O和事件驱动机制,通过过滤器链实现数据处理功能。开发者可以专注于业务逻辑,而无需关心底层的网络细节。通过学习和掌握MINA,我们可以构建稳定、高效...