apache Mina自学

来源:互联网 发布:二手交易管理系统源码 编辑:程序博客网 时间:2024/06/09 21:55

MIna是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架,通过java NIO技术提供一些API供用户使用

一些重要的MIna接口

  • IoServiece :这个接口在一个线程上负责套接字的建立,拥有自己的 Selector,监听是否有连接被建立。
  • IoProcessor :这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是说它也拥有自己的 Selector,这是与我们使用 JAVA NIO 编码时的一个不同之处,通常在 JAVA NIO 编码中,我们都是使用一个 Selector,也就是不区分 IoService与 IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在 IoService 上的过滤器,并在过滤器链之后调用 IoHandler。  
  • IoAccepter :相当于网络应用程序中的服务器端
  • IoConnector :相当于客户端
  • IoSession :当前客户端到服务器端的一个连接实例
  • IoHandler :这个接口负责编写业务逻辑,也就是接收、发送数据的地方。这也是实际开发过程中需要用户自己编写的部分代码。
  • IoFilter :过滤器用于悬接通讯层接口与业务层接口,这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的 encode与 decode是最为重要的、也是你在使用 Mina时最主要关注的地方。



直接进入代码

我们首先要建立一个监听传入连接的对象,所以使用SOcketAcceptor

import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

Ioacceptor acceptor = new NioSocketAcceptor();

之后,我们定义一个端口,并把SocketAcceptor绑定到这个端口上

private static final int PORT =3456;

acceptor.bind(new InetSocketAddress(PORT));

bind方法:绑定到远程端口并开始处理远程信息请求

接下来我们要配置一个过滤器,这个过滤器日志将会记录下所有我们要用的信息,接下来的过滤器是一个ProtocolCodecFilter,他的作用是把二进制信息和协议信息等等翻译成消息对象,反之亦然,我们使用一个已有的TextLine工厂,让他为你处理文本消息

acceptor.getFilterChain().addLast("logger",new LoggingFilter());

acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))) );

接下来我们定义一个处理器类,所谓处理器类,也就是实现IoHander接口的类,处理器类将用来服务所有用户的请求,

acceptor.setHandler( new TimeServerHandler()  );

现在对Acceptor中的属性进行添加,这将允许我们对socket进行特有的设置

acceptor.getSessionConfig().setReadBufferSize(2048);

acceptor.getSessionConfig().setIdleTime(IdleStatus.Both_IDLE,10);

这两个属性,一个是定义的Session的缓冲区大小,另外一个是定义的多长时间检查一次空闲的Session,当断线时进行重练

下面是处理器代码

public class TimeServerHandler extends IoHandlerAdapter{    @Override    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception    {        cause.printStackTrace();    }    @Override    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 ));    }}

  讲解用到的三个方法

1.exceptionCaught,重写后将对session关闭并把error简单的打印出来

2.messageReceived,定义从客户端接收到的数据,如果为单词quit则关闭回话.否则传回当前时间并打印,

3.sessionIdle,当session处于空闲并且程序执行到

acceptor.getSessionConfig().setIdleTime(IdleStatus.Both_IDLE,10);时,执行此方法

最后就是定义服务器将要监听的socket的地址,并进行启动服务

public class MinaTimeServer{    private static final int PORT = 9123;    public static void main( String[] args ) throws IOException    {        IoAcceptor acceptor = new NioSocketAcceptor();        acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );        acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));        acceptor.setHandler( new TimeServerHandler() );        acceptor.getSessionConfig().setReadBufferSize( 2048 );        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );        acceptor.bind( new InetSocketAddress(PORT) );    }}

0 0
原创粉丝点击