mina框架是什么意思(个人年度总结框架)

参考:http://xinsync.xju.edu.cn/index.php/archives/category/prglang/java/mina简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。下面这个start方法用来初始化MINA:priv…

大家好,又见面了,我是你们的朋友全栈君。

参考: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)这个方法来格式化输出数据
*/

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127387.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 外链式样式表_引入CSS样式表(书写位置)

    外链式样式表_引入CSS样式表(书写位置)CSS初识CSS(CascadingStyleSheets)美化样式CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体、大小、对齐方式等)、图片的外形(宽高、边框样式、边距等)以及版面的布局等外观显示样式。CSS以HTML为基础,提供了丰富的功能,如字体、颜色、背景的控制及整体排版等,而且还可以针对不同的浏览器设置不同的样式。引入CSS样式表(书…

    2022年7月14日
    17
  • CTK框架介绍

    CTK框架介绍转(http://blog.csdn.net/xinqidian2015/article/details/50537325)CTK插件框架可以简单的描述为C++的动态组件系统DesignCTK插件框架的设计有很大的灵感来自OSGi并且使得应用程序由许多不同的组件组合成一个可扩展模型。这个模型允许通过那些组件间共享对象的服务通信。框架的分层模型被展示在图片1中包括:P

    2022年6月5日
    230
  • P2P技术和运用

    P2P技术和运用文章目录1.P2P技术1.1P2P技术优势2.P2P网络结构2.1组建P2P网络要解决的3个基本问题:2.2P2P网络类型:2.3集中式P2P网络2.3.1集中式P2P网络的特点2.3.2集中式P2P优缺点2.3.2.1优点2.3.2.2缺点2.4分布式非结构化P2P网络–Gnutella2.4.1洪泛算法:2.4.2Gnutella:2.4.3PureP2P特点:2.5结构化P2P网络2.5.1DHT的基本概念2.5.1.1DHT的特点2.5.1.2DHT应用举

    2022年6月19日
    20
  • springboot注解大全注解(spring两个方法都注解事务)

    关系型数据库多用到事务,在传统项目中使用xml配置,配置虽然也还好,但是看着很不美观,在使用SpringBoot框架,就简单的多了,以实战为准,直接上代码@Transactionalspring事务注解1.简单开启事务管理@EnableTransactionManagement//启注解事务管理,等同于xml配置方式的<tx:annotation-driven/>2.事务注解详解默认遇到

    2022年4月13日
    51
  • h5页面如何生成二维码_js 根据内容 生成二维码

    h5页面如何生成二维码_js 根据内容 生成二维码uniapp,vue皆可使用首先去下载qrcode.js链接可以在根目录中新建utils文件夹,把下载的js放进去)1.引入js并创建data变量importqrcodefrom’@/utils/qrcode.js’data(){ return{ url:””, qrcodeURL:”” } }, methods:{ //生成url二维满 creatQrCode(){ this.url=window.location.h

    2022年9月25日
    3
  • java socket详解_Java Socket 编程原理及教程「建议收藏」

    java socket详解_Java Socket 编程原理及教程「建议收藏」原标题:JavaSocket编程原理及教程对于JavaSocket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了。首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通…

    2022年10月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号