Apache MINA是一个网络应用程序框架,它用来帮助咱们轻松的创建高性能的,高可扩展的网络应用程序.它为各类传输(好比TCP/IP,UDP/IP)提供了抽 象的,事件驱动的,异步的API.它也经常被被称做"NIO框架库","客户服务框架库","网络套接字库"
java
使用MINA的必要条件:web
MINA 2.0.7 Core
JDK 1.5 +
SLF4J 1.3.0 +(确保使用正确的SLF4J版原本匹配你的日志框架,如:slf4j-log4j12.jar 和 log4j-1.3.x.jar不能一块儿工做)spring
*SLF4J:简单日志门面,它容许你搭配使用任意的日志框架并提供统一的对外接口,它使用了静态绑定,这意味着对应每个日志框架都有一个对应的JAR.以下所示:apache
Logging framework | Required JARs |
---|---|
Log4J 1.2.x | slf4j-api.jar, slf4j-log4j12.jar** |
Log4J 1.3.x | slf4j-api.jar, slf4j-log4j13.jar |
java.util.logging | slf4j-api.jar, slf4j-jdk14.jar** |
Commons Logging | slf4j-api.jar, slf4j-jcl.jar |
注意:api
1.slf4j-api.jar是必须的.网络
2.应该有且只有一个日志框架被配置到class path,如slf4j-log4j12.jar和slf4j-jdk14.jar不能共存,会产生不可预期的行为.session
3.slf4j-api.jar和slf4j-.jar的版本应该对应一致. 多线程
服务端示例:框架
public class MinaTimeServer { private static final int PORT = 9123; public static void main(String[] args) throws IOException { // 咱们须要一个对象来监听链接(NioSocketAcceptor对应TCP,NioDatagramAcceptor对应UDP) IoAcceptor acceptor = new NioSocketAcceptor(); // 组件过滤器链 acceptor.getFilterChain().addLast("logger", new LoggingFilter());// 日志过滤器 acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));// 编解码过滤器 // 定义处理器,它是MINA程序核心将实时的服务于客户端链接请求,它必须实现IoHandler接口 acceptor.setHandler(new TimeServerHandler()); // 设置Session配置信息 acceptor.getSessionConfig().setReadBufferSize(2048);// 告诉操做系统分配多少空间给传输数据 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);// 会话闲置断定,第一个参数指定断定行为依据,第二个参数指定行为持续时间(秒) // 绑定端口并启动监听 acceptor.bind(new InetSocketAddress(PORT)); } } //核心处理类 //IoHandlerAdapter是IoHandler具体实现,继承它能够简化代码 public class TimeServerHandler extends IoHandlerAdapter { @Override // 一场捕获方法应该始终被实现,不然异常将没法正确报告,尽管它的代码逻辑在大多数状况下都是简单的打印和关闭会话这种固化标准模式 public void exceptionCaught(IoSession session, Throwable cause) throws Exception { cause.printStackTrace(); session.close(); } @Override // 用来实时和客户端进行数据交互,根据定义的编解码过滤器的不一样,message将会有所不一样,同时写出数据也要求不一样 // 若是没有指定编解码过滤器,message将是IoBuffer,对应的也要求写出的格式是IoBuffer public void messageReceived(IoSession session, Object message) throws Exception { String str = message.toString(); if (str.trim().equalsIgnoreCase("quit")) { session.close(); return; } Date date = new Date(); session.write(date.toString()); System.out.println("Message written..."); } @Override // 当会话闲置时将调用该方法 public void sessionIdle(IoSession session, IdleStatus status) throws Exception { System.out.println("IDLE " + session.getIdleCount(status)); } }
和Spring整合(顺带一提,看不懂的自行查阅相关资料):异步
<!-- 处理类 --> <bean id="timeHandler" class="com.night.mina.TimeServerHandler"> <!-- 多线程 --> <bean id="CTP" class="java.util.concurrent.Executors" factory-method="newCachedThreadPool"></bean> <bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter"> <constructor-arg ref="CTP"></constructor-arg> </bean> <!-- 日志过滤器 --> <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" /> <!-- 过滤器链 --> <bean id="filterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder"> <property name="filters"> <map> <entry key="executor" value-ref="executorFilter" /> <entry key="loggingFilter" value-ref="loggingFilter" /> </map> </property> </bean> <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.net.SocketAddress" value="org.apache.mina.integration.beans.InetSocketAddressEditor" /> </map> </property> </bean> <!-- 监听类 --> <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor" init-method="bind" destroy-method="unbind"> <property name="defaultLocalAddress" value=":9123" /> <property name="handler" ref="timeHandler" /> <property name="filterChainBuilder" ref="filterChainBuilder" /> </bean>