Mina使用总结

来源:互联网 发布:克利夫兰州立大学 知乎 编辑:程序博客网 时间:2024/06/05 01:13

Mina使用总结

第一步:编写IoService

这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立

IoService 本身既是服务端,又是客户端,我们这里编写服务端,所以使用IoAcceptor 实现

//创建一个非阻塞的server端Socket ,用NIO,初始化了服务端的TCP/IP 的基于NIO 的套接字

   SocketAcceptor acceptor = new NioSocketAcceptor();

 

 

第二步:编写过滤器

 

 

IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、

数据的编码(write 方向)与解码(read 方向)等功能,其中数据的encode 与decode

是最为重要的、也是你在使用Mina 时最主要关注的地方。

 

过滤器IoFilter是MINA核心结构之一,它扮演着一个很重要的角色。它可以过滤所有在MINA服务和对应处理程序之间的I/O事件和请求。如果你有编写Java网络应用程序的经验,你可以放心的把他当做Servlet过滤器的一个远亲。MINA提供了很多现成的过滤器,它们通过简化典型的横切关注点,来加快网络应用程序的开发步伐。

 

过滤器

对应类

用法简述

Blacklist

BlacklistFilter

将黑名单中的远程地址的连接置为阻塞状态

Buffered Write

BufferedWriteFilter

缓冲传出的请求,类似于BufferedOutputStream的作用

Compression

CompressionFilter

压缩所有的数据

ConnectionThrottle

ConnectionThrottleFilter

连接调节器,当连接的速度快于指定的时间间隔时进行阻塞操作

ErrorGenerating

ErrorGeneratingFilter

 

Executor

ExecutorFilter

 

FileRegionWrite

FileRegionWriteFilter

 

KeepAlive

KeepAliveFilter

 

Logging

LoggingFilter

记录事件日志信息,如消息已接收,消息已发送,session打开等等

MDC Injection

MdcInjectionFilter

将IoSession的主键属性注入线程映射表MDC中

Noop

NoopFilter

只是用于测试并不进行实际操作的过滤器

Profiler

ProfilerTimerFilter

测量事件执行时间的过滤器,如消息已接收,消息已发送,session打开等事件的执行时间

ProtocolCodec

ProtocolCodecFilter

编码解码过滤器

Proxy

ProxyFilter

 

Reference counting

ReferenceCountingFilter

跟踪过滤器使用次数的过滤器

RequestResponse

RequestResponseFilter

 

SessionAttributeInitializing

SessionAttributeInitializingFilter

 

StreamWrite

StreamWriteFilter

 

SslFilter

SslFilter

 

WriteRequest

WriteRequestFilter

 

 

 

我们处理最简单的字符串传输,Mina 已经为我们提供了TextLineCodecFactory 编解码

器工厂来对字符串进行编解码处理。

 

 //创建接收数据的过滤器

        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

//设定为一行行的读取数据

        ProtocolCodecFilter filter = new ProtocolCodecFilter(new TextLineCodecFactory());

chain.addLast("objectFilter",filter);

(注意:这里的过滤器其实有很多种,比如用protobuf时就要把过滤器改为StreamWriteFilter。这是因为protocol buf良好的支持字节流,所有要使用此过滤器

 

 

 

 

第三步:编写IoHandler

 //设定服务器消息处理器

        acceptor.setHandler(new ClientMinaServerHandler());

而ClientMinaServerHandler类里面就是自己处理消息的具体发送与接收了

public class ClientMinaServerHandler extends IoHandlerAdapter

{

public void sessionCreated(IoSession session) {

        ...............    }

public void sessionOpened(IoSession session) throws Exception {

     .................

}

  public void messageReceived(IoSession session, Object message)

            throws Exception {

}

.................

 

 

}

 

 

:绑定端口,启动服务器

 //服务器绑定的端口

        int bindPort = 8880;//自己定义的端口号

        //绑定端口,启动服务器

        try {

            acceptor.bind(new InetSocketAddress(bindPort));

        } catch (IOException e) {

            System.out.println("Mina Server start for error!"+bindPort);

            e.printStackTrace();

        }

        System.out.println("Mina Server run done! on port:"+bindPort);

    }

 

 

0 0
原创粉丝点击