java开发——Apache Mina的使用

Apache Mina是一个NIO库,实现非阻塞式通讯。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。

使用步骤:

1、配置Maven

2、配置spring

3、实现编码工厂ProtocolCodecFactory 

4、继承编码器适配器ProtocolEncoderAdapter 

5、实现解码器ProtocolDecoder 

6、继承处理器IoHandlerAdapter 

7、实现心跳工厂KeepAliveMessageFactory 

8、客户端启动

简单介绍:

1、Mina工作流程:

2、3个重要元素

3、IoSession常用方法

4、IoHandler 常用方法

1、配置Maven

<dependency>
    <groupId>org.apache.mina</groupId>
    <artifactId>mina-integration-beans</artifactId>
    <version>2.0.16</version>
</dependency>
<dependency>
    <groupId>org.apache.mina</groupId>
    <artifactId>mina-core</artifactId>
    <version>2.0.16</version>
</dependency>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
        </plugin>
    </plugins>
</build>

2、配置spring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-lazy-init="false">

    <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        <property name="customEditors">
            <map>
                <entry key="java.net.SocketAddress"
                    value="org.apache.mina.integration.beans.InetSocketAddressEditor"></entry>
            </map>
        </property>
    </bean>

    <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
        init-method="bind" destroy-method="unbind">
        <!--端口号 -->
        <property name="defaultLocalAddress" value=":8888"></property>
        <!--绑定自己实现的handler -->
        <property name="handler" ref="serverHandler"></property>
        <!--声明过滤器的集合 -->
        <property name="filterChainBuilder" ref="filterChainBuilder"></property>
        <property name="reuseAddress" value="true" />
    </bean>

    <bean id="filterChainBuilder"
        class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
        <property name="filters">
            <map>
                <!--mina自带的线程池filter -->
                <entry key="executor" value-ref="executorFilter"></entry>
                <entry key="mdcInjectionFilter" value-ref="mdcInjectionFilter" />
                <!--自己实现的编解码器filter -->
                <entry key="codecFilter" value-ref="codecFilter" />
                <!--日志的filter -->
                <entry key="loggingFilter" value-ref="loggingFilter" />
                <!--心跳filter -->
                <entry key="keepAliveFilter" value-ref="keepAliveFilter" />
            </map>
        </property>
    </bean>

    <!-- executorFilter多线程处理 -->
    <bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter" />
    <bean id="mdcInjectionFilter" class="org.apache.mina.filter.logging.MdcInjectionFilter">
        <constructor-arg value="remoteAddress" />
    </bean>

    <!--日志 -->
    <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" />

    <!--编解码 -->
    <bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
        <constructor-arg>
            <!--构造函数的参数传入自己实现的对象 -->
            <bean class="com.onion.mina.server.NSMinaCodeFactory"></bean>
        </constructor-arg>
    </bean>

    <!--心跳检测filter -->
    <bean id="keepAliveFilter" class="org.apache.mina.filter.keepalive.KeepAliveFilter">
        <!--构造函数的第一个参数传入自己实现的工厂 -->
        <constructor-arg>
            <bean class="com.onion.mina.server.NSMinaKeepAliveMessageFactory"></bean>
        </constructor-arg>
        <!--第二个参数需要的是IdleStatus对象,value值设置为读写空闲 -->
        <constructor-arg type="org.apache.mina.core.session.IdleStatus"
            value="BOTH_IDLE">
        </constructor-arg>
        <!--心跳频率,不设置则默认5 -->
        <property name="requestInterval" value="1500" />
        <!--心跳超时时间,不设置则默认30s -->
        <property name="requestTimeout" value="30" />
        <!--默认false,比如在心跳频率为5s时,实际上每5s会触发一次KeepAliveFilter中的session_idle事件,
        该事件中开始发送心跳包。当此参数设置为false时,对于session_idle事件不再传递给其他filter,如果设置为true,
        则会传递给其他filter,例如handler中的session_idle事件,此时也会被触发-->
        <property name="forwardEvent" value="true" />
    </bean>

    <!--自己实现的handler-->
    <bean id="serverHandler" class="com.onion.mina.server.NSMinaHandler" />
</beans>

3、实现编码工厂ProtocolCodecFactory 

public class NSMinaCodeFactory implements ProtocolCodecFactory {
    private final NSProtocalEncoder encoder;
   
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值