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

  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);

acceptor.setReuseAddress(true);//设置的是主服务监听的端口可以重用

acceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用

acceptor.getSessionConfig().setReceiveBufferSize(1024);//设置输入缓冲区的大小

acceptor.getSessionConfig().setSendBufferSize(10240);//设置输出缓冲区的大小

//设置为非延迟发送,为true则不组装成大包发送,收到东西马上发出

acceptor.getSessionConfig().setTcpNoDelay(true);

//设置主服务监听端口的监听队列的最大值为100,如果当前已经有100个连接,再新的连接来将被服务

器拒绝

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

NioSocketAcceptor是MINA的适配器,一切都是从这里开始的。MINA中有个过滤器和处理器的概念,过滤器用来过滤数据,处理器用来处理数据。具体来说MINA的处理模型就是request->过滤器A->过滤器B->处理器->过滤器B->过滤器A->response,这里的request和response类似serlvet的request和response。

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

现在详细描述一下request->WebDecoder->WebHandler->WebEncode->response的过程:

客户端发送一个请求到MINA服务器,这里相当于来了一个requet。请求首先来到

  1. Java代码
  2. WebDecoder类(实现了ProtocolDecoder接口)中的
  3. boolean decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception{}方法
  4. /*
  5. 参数in:用户请求信息全存在这里,读数据就从in这里读。
  6. 参数out:用来输出处理后的数据到Filter的下一个过滤器,如果没有过滤器了就输出到WebHandler,这里有点和
  7. servelt的过滤器类似。利用out.write(Object object);这个函数可以把数据传到下一个Filter。我们可以自己定义
  8. 一个对象,我们假设为Request,用它来传递消息,那末这里就可以写成out.write(new RequsetMessage());
  9. 如果这个方法返回false,就是说当前逻辑包还没接收完(也就是当前的IoBuffer并没有包含足够的数据),需要再次
  10. 执行decode方法(再次获取新的IoBuffer),用来获取足够的数据。如果返回值为true就表示可以不执行decode方
  11. 法了,但是要激活handler方法,必须要调用out.write方法。
  12. public class RequestMessage{}//这里什么也不做
  13. */
  14. WebDecoder类(实现了ProtocolDecoder接口)中的
  15. boolean decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception{}方法
  16. /*
  17. 参数in:用户请求信息全存在这里,读数据就从in这里读。
  18. 参数out:用来输出处理后的数据到Filter的下一个过滤器,如果没有过滤器了就输出到WebHandler,这里有点和
  19. servelt的过滤器类似。利用out.write(Object object);这个函数可以把数据传到下一个Filter。我们可以自己定义
  20. 一个对象,我们假设为Request,用它来传递消息,那末这里就可以写成out.write(new RequsetMessage());
  21. 如果这个方法返回false,就是说当前逻辑包还没接收完(也就是当前的IoBuffer并没有包含足够的数据),需要再次
  22. 执行decode方法(再次获取新的IoBuffer),用来获取足够的数据。如果返回值为true就表示可以不执行decode方
  23. 法了,但是要激活handler方法,必须要调用out.write方法。
  24. public class RequestMessage{}//这里什么也不做
  25. */
  26. 然后到
  27. Java代码
  28. WebHandler(扩展了IoHandlerAdapter抽象类)中的
  29. void messageReceived(IoSession session, Object message) throws Exception{}方法
  30. WriteFuture future = session.write(response);//session中必须加入这个代码,才会激活encode方法
  31. future.addListener(IoFutureListener.CLOSE);//这个的作用是发送完毕后关闭连接,加了就是短连接,不然是长连接
  32. IoFutureListener里面有个operationComplete(IoFuture future)方法,当流发送完成之后才调用这个方法。
  33. /*
  34. 参数message:用来获取Filter传递过来的对象.对应代码RequestMessage request = (RequestMessage) message;
  35. 参数session:用来发送数据到Filter.对应代码session.write(new ResponseMessage());
  36. public class ResponseMessage{}//这里什么也不做,假设存放处理后的数据
  37. 注意:对于一个MINA程序而言,对于WebHandler类只生成一个对象,所以要考虑线程安全问题
  38. */
  39. WebHandler(扩展了IoHandlerAdapter抽象类)中的
  40. void messageReceived(IoSession session, Object message) throws Exception{}方法
  41. WriteFuture future = session.write(response);//session中必须加入这个代码,才会激活encode方法
  42. future.addListener(IoFutureListener.CLOSE);//这个的作用是发送完毕后关闭连接,加了就是短连接,不然是长连接
  43. IoFutureListener里面有个operationComplete(IoFuture future)方法,当流发送完成之后才调用这个方法。
  44. /*
  45. 参数message:用来获取Filter传递过来的对象.对应代码RequestMessage request = (RequestMessage) message;
  46. 参数session:用来发送数据到Filter.对应代码session.write(new ResponseMessage());
  47. public class ResponseMessage{}//这里什么也不做,假设存放处理后的数据
  48. 注意:对于一个MINA程序而言,对于WebHandler类只生成一个对象,所以要考虑线程安全问题
  49. */
  50. 然后到
  51. Java代码
  52. WebEncoder类(实现了ProtocolEncoder接口)中的
  53. boolean encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception{}
  54. 方法
  55. /*
  56. 参数message:用来获取上一个Filter节点的数据或者处理器的数据(如果这个过滤器为最靠近处理器的那个)
  57. ResponseMessage response = (ResponseMessage)message;
  58. 参数out:用来输出数据到下一个Filter节点过或者到客户端,用out.write(Object encodedMessage)把数据发送
  59. 出去,但是要注意的是,如果这个Filter下一个节点如果是客户端的话,那个这个encodedMessage数据必须为
  60. IoBuffer类型的,可以利用IoBuffer.wrap(byte[] byteArray)这个方法来格式化输出数据
  61. */
  62. WebEncoder类(实现了ProtocolEncoder接口)中的
  63. boolean encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception{}
  64. 方法
  65. /*
  66. 参数message:用来获取上一个Filter节点的数据或者处理器的数据(如果这个过滤器为最靠近处理器的那个)
  67. ResponseMessage response = (ResponseMessage)message;
  68. 参数out:用来输出数据到下一个Filter节点过或者到客户端,用out.write(Object encodedMessage)把数据发送
  69. 出去,但是要注意的是,如果这个Filter下一个节点如果是客户端的话,那个这个encodedMessage数据必须为
  70. IoBuffer类型的,可以利用IoBuffer.wrap(byte[] byteArray)这个方法来格式化输出数据
  71. */

NIO_TEST.rar (13.9 KB)

描述: 阻塞和非阻塞io的简单通信程序(原作者的例子,但不是用Mina写的,可以作为学习java Nio的一个参考资料,因为Mina的基础就是Java Nio).

MINA框架使用总结相关推荐

  1. Camera开发系列之六-使用mina框架实现视频推流

    章节 Camera开发系列之一-显示摄像头实时画面 Camera开发系列之二-相机预览数据回调 Camera开发系列之三-相机数据硬编码为h264 Camera开发系列之四-使用MediaMuxer封 ...

  2. 基于MINA框架快速开发网络应用程序

    1.MINA框架简介  MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架.通过使用 ...

  3. Mina框架项目运用

    近期最一个项目对通信要求比較严格,须要建立长连接,且能处理多并发,所以选择了Mina框架.以下就简单记录开发的过程吧: mina 开发须要的jar包: mina pc端通信: 服务端: package ...

  4. 搭建Apache Mina框架并实现Server与Client端的简单消息传递

    http://www.himigame.com/apache-mina/831.html :(作者新浪微博: @李华明Himi ) 转载自[黑米GameDev街区] 原文链接: http://www. ...

  5. 基于PHP+小程序(MINA框架)+Mysql数据库的食堂餐厅就餐预约小程序系统设计与实现

    项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信高校食堂就餐预约小程序系统,前台用户使用小程序,小程序使用微信开发者工具开发:后台管理使用基PP+MySql的B/S架构,开发工具使用p ...

  6. 基于PHP+小程序(MINA框架)+Mysql数据库的旅游攻略小程序系统设计与实现

    项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信景区景点旅游攻略小程序系统,前台用户使用小程序,小程序使用微信开发者工具开发:后台管理使用基PP+MySql的B/S架构,开发工具使用p ...

  7. 基于PHP+小程序(MINA框架)+Mysql数据库的新生自助报到小程序系统设计与实现

    项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信小程序新生报到系统,前台用户使用小程序,后台管理使用基PHP+MySql的B/S架构:通过后台添加学校信息.分院信息.班级信息.老师信息 ...

  8. 基于PHP+小程序(MINA框架)+Mysql数据库的评选投票小程序系统设计与实现

    项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信小程序评选投票系统,前台用户使用小程序,后台管理使用基PHP+MySql的B/S架构:通过后台添加资讯.管理上传投票信息.用户管理等:用 ...

  9. 基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的教室图书馆座位预约小程序系统设计与实现

    项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信小程序预约订座小程序,前台用户使用小程序,后台管理使用Java+Mysql开发,后台使用了springboot框架:通过后台添加座位类型 ...

  10. 基于PHP+小程序(MINA框架)+Mysql数据库的小说小程序系统设计与实现

    项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信小程序的在线免费小说平台,前台用户使用小程序,后台管理使用基PHP+MySql的B/S架构:管理员通过后台录入作者信息,发布资讯,管理会 ...

最新文章

  1. MySql8.0.19最新版本创建用户分配权限演示,You have an error in your SQL syntax权限分配问题解决方法
  2. 图文详解】Chrome中安装JsonView插件
  3. 什么是informer机制
  4. 常用正则表达式总结(js与C#对照)
  5. 优酷开放sdk-setOnerroListener
  6. java 获取类方法_Java之反射机制三:获取类的方法
  7. Qt学习之如何启动和终止一个线程
  8. android中ScrollView和GridView/ListView共存时,ScrollView不在顶部的解决方法
  9. springboot做梦网云科技短信业务
  10. 移动警务综合应用平台(交警)解决方案
  11. 跳舞毯行业调研报告 - 市场现状分析与发展前景预测
  12. MAC下 生成安卓签名证书.keystore文件【详细】
  13. 磁条卡,IC卡,ID卡,信用卡芯片卡,信用卡磁条卡 等等的区别
  14. phpstorm根据关键字全局搜索
  15. Spark——累加器的理解
  16. 【论文阅读|深读】 GraphSAGE:Inductive Representation Learning on Large Graphs
  17. Xshell4连接Linux系统中文显示乱码解决办法
  18. iOS10 获取系统通讯录新方法
  19. 【SEO优化】什么是长尾关键词?
  20. 漏洞漏洞-linux漏洞修复命令

热门文章

  1. NZT 全息备份 详解
  2. 【selenium】Windows平台下使用python自动登陆网关 (更新至 v1.1.0)
  3. 视频VESA标准介绍及图解
  4. 发版模式(蓝绿、灰度、滚动)简单原理
  5. 火狐FireFox和IE浏览器的title属性文本过长显示不全问题
  6. STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE
  7. html导航怎么加图标,纯 CSS 实现导航图标动画
  8. 上海宝付大数据分析storm结合
  9. win7蓝屏_win7操作系统服役结束。电脑蓝屏0X000000F4处理办法。
  10. VR全景加盟创业是不是骗局?谈谈自己的几点问题和思考