`
a11632
  • 浏览: 7877 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

mina1

    博客分类:
  • mina
 
阅读更多

简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。

下面这个start方法用来初始化MINA

Java代码 复制代码
  1. private void start(int port, WebContext ctx)
  2. throws IOException, InstantiationException
  3. , IllegalAccessException, ClassNotFoundException {
  4. //初始化Acceptor
  5. NioSocketAcceptor acceptor = new NioSocketAcceptor(5);
  6. java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(1500);//建立线程池
  7. //加入过滤器(Filter)到Acceptor
  8. acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
  9. acceptor.getFilterChain().addLast("codec",
  10. new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));
  11. LoggingFilter filter = new LoggingFilter();
  12. filter.setExceptionCaughtLogLevel(LogLevel.DEBUG);
  13. filter.setMessageReceivedLogLevel(LogLevel.DEBUG);
  14. filter.setMessageSentLogLevel(LogLevel.DEBUG);
  15. filter.setSessionClosedLogLevel(LogLevel.DEBUG);
  16. filter.setSessionCreatedLogLevel(LogLevel.DEBUG);
  17. filter.setSessionIdleLogLevel(LogLevel.DEBUG);
  18. filter.setSessionOpenedLogLevel(LogLevel.DEBUG);
  19. acceptor.getFilterChain().addLast("logger", filter);
  20. acceptor.setReuseAddress(true);//设置的是主服务监听的端口可以重用
  21. acceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用
  22. acceptor.getSessionConfig().setReceiveBufferSize(1024);//设置输入缓冲区的大小
  23. acceptor.getSessionConfig().setSendBufferSize(10240);//设置输出缓冲区的大小
  24. //设置为非延迟发送,为true则不组装成大包发送,收到东西马上发出
  25. acceptor.getSessionConfig().setTcpNoDelay(true);
  26. //设置主服务监听端口的监听队列的最大值为100,如果当前已经有100个连接,再新的连接来将被服务器拒绝
  27. acceptor.setBacklog(100);
  28. acceptor.setDefaultLocalAddress(new InetSocketAddress(port));
  29. //加入处理器(Handler)到Acceptor
  30. acceptor.setHandler(new WebHandler());
  31. acceptor.bind();
  32. }
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。

Java代码 复制代码
  1. acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
  2. //加入一个线程池到适配器,这里用的是jdk自带的线程池
acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
//加入一个线程池到适配器,这里用的是jdk自带的线程池
Java代码 复制代码
  1. acceptor.getFilterChain().addLast("codec",
  2. new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));
  3. //这里是处理逻辑的关键部位,请求的处理都是在WebDecoder类和WebEncoder类中处理,可以明显从命名上看出来一个是用来解码,另一个是用来编码,requet过来后先进入WebDecoder类(实现了ProtocolDecoder接口)进行解码处理,这里可以加入自己的逻辑把传进来的流解码成自己需要的信息。而WebEncoder类(实现了ProtocolEncoder接口)是进行编码,在这个类里面加入自己的逻辑把处理后的信息组装发送给客户端(response)。而在解码和编码过程中WebHandler(扩展了IoHandlerAdapter抽象类)起到了处理器的作用。
  4. //request->WebDecoder->WebHandler->WebEncode->response
 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。请求首先来到

Java代码 复制代码
  1. WebDecoder类(实现了ProtocolDecoder接口)中的
  2. boolean decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception{}方法
  3. /*
  4. 参数in:用户请求信息全存在这里,读数据就从in这里读。
  5. 参数out:用来输出处理后的数据到Filter的下一个过滤器,如果没有过滤器了就输出到WebHandler,这里有点和
  6. servelt的过滤器类似。利用out.write(Object object);这个函数可以把数据传到下一个Filter。我们可以自己定义
  7. 一个对象,我们假设为Request,用它来传递消息,那末这里就可以写成out.write(new RequsetMessage());
  8. 如果这个方法返回false,就是说当前逻辑包还没接收完(也就是当前的IoBuffer并没有包含足够的数据),需要再次
  9. 执行decode方法(再次获取新的IoBuffer),用来获取足够的数据。如果返回值为true就表示可以不执行decode方
  10. 法了,但是要激活handler方法,必须要调用out.write方法。
  11. public class RequestMessage{}//这里什么也不做
  12. */
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{}//这里什么也不做
*/

然后到

Java代码 复制代码
  1. WebHandler(扩展了IoHandlerAdapter抽象类)中的
  2. void messageReceived(IoSession session, Object message) throws Exception{}方法
  3. WriteFuture future = session.write(response);//session中必须加入这个代码,才会激活encode方法
  4. future.addListener(IoFutureListener.CLOSE);//这个的作用是发送完毕后关闭连接,加了就是短连接,不然是长连接
  5. IoFutureListener里面有个operationComplete(IoFuture future)方法,当流发送完成之后才调用这个方法。
  6. /*
  7. 参数message:用来获取Filter传递过来的对象.对应代码RequestMessage request = (RequestMessage) message;
  8. 参数session:用来发送数据到Filter.对应代码session.write(new ResponseMessage());
  9. public class ResponseMessage{}//这里什么也不做,假设存放处理后的数据
  10. 注意:对于一个MINA程序而言,对于WebHandler类只生成一个对象,所以要考虑线程安全问题
  11. */
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类只生成一个对象,所以要考虑线程安全问题
 */

然后到

Java代码 复制代码
  1. WebEncoder类(实现了ProtocolEncoder接口)中的
  2. boolean encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception{}
  3. 方法
  4. /*
  5. 参数message:用来获取上一个Filter节点的数据或者处理器的数据(如果这个过滤器为最靠近处理器的那个)
  6. ResponseMessage response = (ResponseMessage)message;
  7. 参数out:用来输出数据到下一个Filter节点过或者到客户端,用out.write(Object encodedMessage)把数据发送
  8. 出去,但是要注意的是,如果这个Filter下一个节点如果是客户端的话,那个这个encodedMessage数据必须为
  9. IoBuffer类型的,可以利用IoBuffer.wrap(byte[] byteArray)这个方法来格式化输出数据
  10. */
分享到:
评论

相关推荐

    mina开发实例

    由于压缩包中的文件名为"Mina1",我们可以推测它可能是第一个示例或者一个初级教程,涵盖了基本的Mina服务端和客户端创建。通过学习这个实例,开发者可以了解到如何启动Mina服务器,如何连接到服务器,以及如何在...

    Apache.Mina.Server.2.0.中文参考手册_李海峰

    #### 四、Mina 2.0 与 Mina 1.x 的区别 虽然Mina 1.x系列已经非常成熟和稳定,但2.0版本在设计上做出了较大的改进,以适应更高的性能要求和更复杂的业务场景。Mina 2.0引入了更多现代化的特性,例如: - 更加灵活的...

    Apache_Mina_Server中文参考手册.pdf

    由于Mina 2.x版本和1.x版本在功能上存在一些差异,所以开发者在使用Mina 1.x版本中的一些功能可能并不适用于2.x版本。在学习Mina框架的相关文档前,开发者需要具备一定的Java基础,特别是要熟悉Java IO、Socket编程...

    MINA 1.0 版本的源码以及相关的例子依赖包等

    MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,用于构建服务器端应用程序,尤其在开发TCP和UDP协议的应用时非常有用。MINA 1.0 版本是该框架的一个...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    1. **Mina的高级使用** Mina的核心在于其异步事件驱动的模型,这使得它在处理大量并发连接时表现出色。通过使用I/O多路复用技术,如NIO(非阻塞I/O),Mina能够高效地管理多个连接,而无需为每个连接创建单独的线程...

    apache-mina-2.0.4.rar_apache mina_mina

    1. **Filter Chain**:Mina的核心设计模式之一是过滤器链。每个连接都有一系列过滤器,它们按照顺序处理入站和出站事件。过滤器可以实现特定功能,如数据编码解码、安全验证、性能监控等。 2. **Session**:Session...

    Mina中文参考手册-API

    文档中提到的是最新版本2.0,如果读者之前使用的是Mina 1.x版本,可能会发现某些功能并不适用。Mina的API设计目的是将网络通信的复杂性与应用程序代码隔离开来,使得开发者可以更专注于应用层面的业务逻辑。 Mina...

    mina中文开发手册.pdf

    在本手册中,将重点讲解最新版本的Mina 2.0,需要注意的是,Mina 1.x版本中的一些功能可能在2.0版本中并不适用,因此需要开发者更新知识库以适应新版本。 Mina框架的API设计是为了将底层的网络通信细节与应用程序...

    MINA_API+MINA_DOC+mina

    MINA (Java IO Network Application Framework) 是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务器。这个压缩包包含了MINA API文档、自学手册以及开发指南,对于学习和...

    apache mina

    - Mina1_类.pdf可能涵盖了MINA框架的基础类和组件介绍。 - Mina3_与IoHandler相关的几个类.pdf和Mina2_与IoFilter相关的几个类.pdf将深入探讨IoHandler和IoFilter的具体实现类及其功能。 - Mina4_IoFilter和...

    Apache_Mina_Server_2.0中文参考手册.pdf

    Mina 2.0 作为最新版本,相较于 Mina 1.x,引入了更新的特性和改进。使用 Mina 2.0 开发应用之前,需要掌握 Java I/O、Java NIO 以及线程和并发库(java.util.concurrent)的知识。 Mina 架构中的几个关键组件包括 ...

    mina连接 mina心跳连接 mina断线重连

    1. **检测连接状态**:心跳机制是检测连接状态的主要方式,如果心跳超时未响应,就认为连接中断。 2. **关闭连接**:一旦确定连接异常,应当立即关闭当前的IoSession。 3. **清理资源**:释放与旧连接相关的资源,如...

    Mina+Socket通信

    Mina和Socket是两种常见的网络通信框架和技术,它们在Java编程环境中被广泛使用。本篇文章将深入探讨如何使用Mina与Socket实现通信,并提供客户端和服务端的实现代码概述。 Mina(全称“MINA: Minimalistic ...

    Mina2.0中文参考手册(word版)

    Mina 有两个主要分支,即 Mina 1.x 和 2.x,而本文档专注于 Mina 2.0 版本。在使用 Mina 2.0 开发时,开发者需要具备 Java IO、NIO、Java Socket、多线程以及并发库(如 `java.util.concurrent.*`)的基础知识。Mina...

    mina2.0 含11个jar包

    mina-core-2.0.0-M6.jar mina-example-2.0.0-M6.jar mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-...

    给予mina 协议进行大数据传输

    1. **非阻塞I/O**:MINA使用Java NIO(非阻塞I/O)库,这允许在单个线程中处理多个连接,极大地提高了系统资源的利用率和并发性能。 2. **事件驱动**:MINA基于事件驱动的设计,通过监听网络事件(如连接建立、数据...

    mina新手教程源码 mina+springboot+idea最简单的案例。

    * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目,会启动两个服务两个端口,一个是http服务,一个是mina服务。两个服务互不影响 * 2、...

    mina demo mina jar包

    Apache Mina是一个开源项目,它提供了一个高度可扩展的网络通信框架,用于简化开发高性能、高可用性的网络服务器和客户端应用程序。"Mina demo mina jar包"指的是使用Apache Mina框架创建的一个演示示例,这个示例...

    mina.zip内涵所有mina所需jar包

    Apache Mina是一个高度可扩展的Java网络通信框架,它提供了简单而强大的开发接口,用于创建高性能、高效率的网络应用程序。Mina的核心理念是将网络协议处理与业务逻辑分离,使得开发者可以专注于实现应用程序的业务...

    Mina开发实例(服务端、客户端)DEMO

    Apache Mina是一个高度可扩展的网络通信框架,它允许开发者创建高性能、高效率的服务端和客户端应用程序。在Java世界中,Mina以其简洁的API和灵活性而受到青睐,尤其适用于处理大量的并发连接,如TCP/IP和UDP协议。...

Global site tag (gtag.js) - Google Analytics