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) ); }}
- apache Mina自学
- apache mina 自学
- Apache Mina
- Apache Mina
- Apache Mina
- Apache Mina
- apache mina
- Apache Mina
- apache mina
- Apache MINA
- Apache mina
- Apache Mina
- Apache Mina
- Apache Mina
- Apache MINA - Mina 特性说明
- Apache MINA 应用进阶
- Apache MINA 项目介绍
- Apache MINA 应用进阶
- 透镜看游戏(零)
- One Bomb
- Fragment的接口回调
- SSD安装及训练自己的数据集
- ypedef struct LNode结构指针
- apache Mina自学
- java初级之24方法的重载
- 基于Tair存储的广告服务性能优化总结及思考
- 寻址范围总结
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- git reset应用场景说明
- Linux开放1521端口允许网络连接Oracle Listene
- ScrollView,使用v4包下进行和新控件使用
- virtualenv命令行创建django项目