Apache MINA --- [简易入门]

为君一笑 提交于 2020-01-08 13:33:12

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

Apache MINA是一个网络应用程序框架,它用来帮助我们轻松的建立高性能的,高可扩展的网络应用程序.它为各种传输(比如TCP/IP,UDP/IP)提供了抽 象的,事件驱动的,异步的API.它也常常被被称作"NIO框架库","客户服务框架库","网络套接字库"

使用MINA的必要条件:

MINA 2.0.7 Core
JDK 1.5 +
SLF4J 1.3.0 +(确保使用正确的SLF4J版本来匹配你的日志框架,如:slf4j-log4j12.jar 和 log4j-1.3.x.jar不能一起工作)

*SLF4J:简单日志门面,它允许你搭配使用任意的日志框架并提供统一的对外接口,它使用了静态绑定,这意味着对应每一个日志框架都有一个对应的JAR.如下所示:

Logging framework Required JARs
Log4J 1.2.x slf4j-api.jar, slf4j-log4j12.jar**
Log4J 1.3.x slf4j-api.jarslf4j-log4j13.jar
java.util.logging slf4j-api.jar, slf4j-jdk14.jar**
Commons Logging slf4j-api.jarslf4j-jcl.jar

注意:

    1.slf4j-api.jar是必须的.

    2.应该有且只有一个日志框架被配置到class path,如slf4j-log4j12.jar和slf4j-jdk14.jar不能共存,会产生不可预期的行为.

    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>


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!