您的位置:首页 > 编程语言 > Java开发

spring集成mina简明教程

2015-08-20 15:36 507 查看
mina服务端代码如下:

try {
            IoAcceptor accept = new NioSocketAcceptor();
            DefaultIoFilterChainBuilder chain = accept.getFilterChain();
            accept.getSessionConfig().setReadBufferSize(2048);
            accept.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
            accept.setHandler(new ServerHandler());
            LoggingFilter loggingFilter = new LoggingFilter();
            chain.addLast("logging", loggingFilter);
            chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(
                    Charset.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),
                    LineDelimiter.WINDOWS.getValue())));
            accept.bind(new InetSocketAddress(9123));
            logger.info("server成功启动");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


[b]ServerHandler的代码如下:

[/b]
public class ServerHandler extends IoHandlerAdapter{
    private static final Logger log = Logger.getLogger(ServerHandler.class);
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        InetSocketAddress adress = (InetSocketAddress) session.getRemoteAddress();
        System.out.println("hostString:"+adress.getHostString());
        System.out.println("hostName:"+adress.getHostName());
        System.out.println("address:"+adress.getAddress());
        System.out.println("port:"+adress.getPort());
       
    }
    @Override
    public void messageReceived(IoSession session,Object message)throws Exception{
        String str = message.toString();
        log.info("The message received is ["+str+"]");
        
        System.out.println("the message received is "+str);
        if(str.endsWith("quit")){
            session.close(true);
            return;
        }
    }
}


在spring中集成mina无非是将创建对象和给对象设置属性的过程以配置文件的形式实现
配置文件如下:
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    <bean id="serverHandler" class="com.snail.mina.server.ServerHandler"/>
    <bean id="protocolCodecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
        <constructor-arg>
            <bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory"/>
            
        </constructor-arg>
    </bean>
    <bean id="defaultIoFilterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
        <property name="filters">
            <map>
                <entry key="codecFilter" value-ref="protocolCodecFilter"/>
            </map>
        </property>
    </bean>
    <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
        init-method="bind" destroy-method="unbind">
        <span style="color:#FF0000;"><property name="defaultLocalAddress" value=":9123"/>①//问题所在</span>
        <property name="handler" ref="serverHandler"/>
        <property name="filterChainBuilder" ref="defaultIoFilterChainBuilder"/>
    
    </bean>
</beans>


问题就出在①处,该处对应的java代码如下:
accept.bind(new InetSocketAddress(9123));

这句话的意思是给IoAccept绑定监听端口,我们知道spring中的value都是字符串,虽然value可以自动转化成int,double等类型,但是value不能转化成对象,那我们如何解决呢?
===================================================================

解决办法:

spring中的属性编辑器可以帮我们解决这个问题,当我们想用字符串来表示对象时我们就需要用到属性编辑器,对于本例中需要用到的参数InetSocketAddress来说,spring中自带了该类型的编辑器,配置如下(如需其他属性编辑器请自行搜索):
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        <property name="customEditors">
            <map>
                <entry key="java.net.SocketAddress">
                    <bean class="org.apache.mina.integration.beans.InetSocketAddressEditor"/>
                </entry>
            </map>
        </property>
    </bean>
需要注意的InetSocketAddressEditor是mina-integration-beans.jar包下的一个类,我们需要在pom.xml中加入这个依赖,代码如下

<dependency>
        <groupId>org.apache.mina</groupId>
        <artifactId>mina-integration-beans</artifactId>
        <version>2.0.7</version>
    </dependency>
加上这个依赖后项目会报错,报错信息如下:

Failed to execute goal on project mina-test: Could not resolve dependencies for project com.snail.mina:mina-test:jar:0.0.1-SNAPSHOT:
<span style="color:#CC0000;">Failure to find org.apache.mina:mina-core:bundle:2.0.7</span> in http://10.5.1.13:8081/nexus/content/groups/public was cached in the local 
repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced -> [Help 1]


出现这个问题的原因是因为mina打包为bundle(这个过程我也不清楚,有兴趣的同学可以百度 maven bundle)

解决办法是在pom.xml中加入相应的插件,代码如下:

<build>
            <plugins>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <extensions>true</extensions>
                </plugin>
            </plugins>
        </build>
启动本地服务器,用Secure CRT连接本地服务器(也可以用DOS连接,或者自己写客户端也可以)



控制台输出如下:



如有写的不明白的地方可以在下面留言!!!

THE END!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: