Mina 使用文档

mlgb000 贡献于2014-07-08

作者 GHOST  创建于2009-02-20 02:17:00   修改者Chinese User  修改于2009-05-15 02:32:00字数18154

文档摘要:Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。。本文将通过官方网站上的快速入门程序 来介绍 MINA 的基础架构的同时演示如何使用MINA 开发网络应用程序。
关键词:

Mina使用 1Mina简介: Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。。本文将通过官方网站上的快速入门程序 来介绍 MINA 的基础架构的同时演示如何使用MINA 开发网络应用程序。 2环境准备: l 首先到官方网站下载最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html。下载之前先介绍一下 MINA 的两个版本:1.0.x 适合运行环境为 JDK1.4,1.1.x 适合 JDK1.5 的版本,两者的编译环境都需要 JDK1.5。JDK1.5 已经是非常普遍了,本文中使用 1.1.5 版本的 MINA,编译和运行所需的文件是 mina-core-1.1.7.jar。 l 下载 MINA 的依赖包 slf4j。MINA 使用此项目作为日志信息的输出,而 MINA 本身并不附带此项目包,请到http://www.slf4j.org/download.html 地址下载 slf4j 包,slf4j 项目解压后有很多的文件,本例中只需要其中的 slf4j-api-1.5.2.jar 和 slf4j-simple-1.5.2.jar 这两个 jar 文件。如果没有这两个文件就会导致启动例子程序的时候报 org/slf4j/LoggerFactory 类没找到的错误。 当然要求机器上必须装有 1.5 或者更新版本的 JDK。 l 最好你应该选择一个顺手的 Java 开发环境例如 Eclipse 或者 NetBeans 之类的,可以更方便的编码和调试。 3MINA 基本类的描述: 3.1 IoService应用程序入口 IoService负责底层通讯接入,IoAcceptor(服务器端)和IoConnector(客户端)是IoService的扩展接口。 备注:IoAcceptor()可以同时启动多个端口,每个端口可以指定不同的handler 和filter,但是一个服务端只有一个监听器。 IoService中的方法 void addListener(IoServiceListener listener) Adds an IoServiceListener that listens any events related with this service. 添加监听器用来监听与这个service相关的所有事件。 IoServiceConfig getDefaultConfig() Returns the default configuration which is used when you didn't specify any configuration. 返回这个service的默认配置。 DefaultIoFilterChainBuilder getFilterChain() A shortcut for ( ( DefaultIoFilterChainBuilder ) getFilterChainBuilder() ). 获取DefaultIoFilterChainBuilder的简便方法。 IoFilterChainBuilder getFilterChainBuilder() Returns the global IoFilterChainBuilder which will modify the IoFilterChain of all IoSessions which is managed by this service. 获取一个全局的IoFilterChainBuilder(过滤器链构建器,暂时这么翻译),这个构建器可以修改与当前service相关的所有session的过滤器链。 Set getManagedServiceAddresses() Returns all SocketAddresses this service is managing. 返回当前service所管理的所有的Socket地址 Set getManagedSessions(SocketAddress serviceAddress) Returns all sessions with the specified remote or local address, which are currently managed by this service. 返回当前service管理的指定地址的所有session回话。 boolean isManaged(SocketAddress serviceAddress) Returns true if this service is managing the specified serviceAddress. 给定一个Socket地址,如果当前service正在管理这个地址,则返回真。 void removeListener(IoServiceListener listener) Removed an existing IoServiceListener that listens any events related with this service. 移除指定监听器。 void setFilterChainBuilder(IoFilterChainBuilder builder) Sets the global IoFilterChainBuilder which will modify the IoFilterChain of all IoSessions which is managed by this service. 设置一个全局的IoFilterChainBuilder(过滤器链构建器,暂时这么翻译),这个构建器可以修改与当前service相关的所有session的过滤器链。 3.2 IoAcceptor 相当于网络应用程序中的服务器端 void bind(SocketAddress address, IoHandler handler) 绑定服务器到指定的地址(address),并指定处理器(handler)来处理接入的链接。 void bind(SocketAddress address, IoHandler handler, IoServiceConfig config) 设置服务器的设置(config),绑定服务器到指定的地址(address),并指定处理器(handler)来处理接入的链接。 IoSession newSession(SocketAddress remoteAddress, SocketAddress localAddress) ( 可选) 在本地(localAddress)与远程(remoteAddress)处于链接的情况下,获取一个建立在它们之间的新的会话。 void unbind(SocketAddress address) 解除服务器与指定地址的绑定,并断开所有与此服务器链接的客户端。 void unbindAll() 解除所有由当前acceptor绑定的所有地址。 程序见4.1附件。 3.3 IoConnector 相当于客户端 IoConnector中的方法 ConnectFuture connect(SocketAddress address, IoHandler handler) Connects to the specified address. 连接到指定地址的服务器。 ConnectFuture connect(SocketAddress address, IoHandler handler, IoServiceConfig config) Connects to the specified address. 连接到指定地址的服务器。 ConnectFuture connect(SocketAddress address, SocketAddress localAddress, IoHandler handler) Connects to the specified address. 连接到指定地址的服务器。 ConnectFuture connect(SocketAddress address, SocketAddress localAddress, IoHandler handler, IoServiceConfig config) Connects to the specified address. 连接到指定地址的服务器。 示例程序见附件: 3.4 IoSession 当前客户端到服务器端的一个连接实例 CloseFuture close() 关闭当前会话。 IoFilterChain getFilterChain() 获取当前会话的过滤器链。 IoHandler getHandler() 获取当前会话的处理器。 SocketAddress getLocalAddress() 获取与当前会话链接的本地地址。 SocketAddress getRemoteAddress() 获取链接到当前会话的远程计算机地址。 WriteFuture write(Object message) 发送指定的message到远程计算机。 3.5 IoHandler 业务处理逻辑 该接口有五个实现类ChainedIoHandler, DemuxingIoHandler, IoHandlerAdapter, SingleSessionIoHandlerDelegate, StreamIoHandler。其中ChainedIoHandler, DemuxingIoHandler, StreamIoHandler实现了接口,并继承了IoHandlerAdapter,IoHandlerAdapter实现了接口的所有方法,但是在方法中并没有做什么,我们可以继承它,根据需要有选择的重写其中的方法。 一个IoHandler接口具有如下一些方法: void exceptionCaught(IoSession session, Throwable cause) 当接口中其他方法抛出异常未被捕获时触发此方法 void messageReceived(IoSession session, Object message) 当接收到客户端的请求信息后触发此方法. void messageSent(IoSession session, Object message) 当信息已经传送给客户端后触发此方法. void sessionClosed(IoSession session) 当连接被关闭时触发,例如客户端程序意外退出等等. void sessionCreated(IoSession session) 当一个新客户端连接后触发此方法. void sessionIdle(IoSession session, IdleStatus status) 当连接空闲时触发此方法. void sessionOpened(IoSession session) 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发 StreamIoHandler类提供了基于流的I/O支持,继承这个类并实现processStreamIo(IoSession session, InputStream in, OutputStream out)方法来执行I/O操作: protected abstract void processStreamIo(IoSession session, InputStream in, OutputStream out) 实现这个方法来执行你的流I/O操作。 DemuxingIoHandler将接收事件分离到指定的MessageHandler中。 MessageHandler addMessageHandler(Class type, MessageHandler handler) 注册一个MessageHandler用来接收指定类型的message MessageHandler getMessageHandler(Class type) 获取一个已注册的用来处理指定类型的MessageHandler Map getMessageHandlerMap() 返回在此handler中注册的所有MessageHandler的Map,以键值对的形式(Type-MessageHandler)。 void messageReceived(IoSessionsession,Object message) 将接收事件引入到一个指定的MessageHandler中。 MessageHandler removeMessageHandler(Class type) 注销一个指定类型的MessageHandler。 ChainedIoHandler 构造方法 ChainedIoHandler() Creates a new instance which contains an empty IoHandlerChain. 创建一个含有空的IoHandlerChain的实例。 ChainedIoHandler(IoHandlerChain chain) Creates a new instance which executes the specified IoHandlerChain on a messageReceived event. 创建一个含有指定IoHandlerChain的实例。 Method Summary IoHandlerChain getChain() Returns the IoHandlerCommand this handler will use to handle messageReceived events. 返回一个用来处理messageReceived事件的IoHandlerChain void messageReceived(IoSession session, Object message) Handles the specified messageReceived event with the IoHandlerCommand or IoHandlerChain you specified in the constructor. 通过在构造方法中定义的IoHandlerChain或IoHandlerCommand来处理指定的messageReceived事件。 3.6 IoFilter 过滤器用于悬接通讯层接口与业务层接口。 IoFilter是MINA核心构造之一,扮演非常重要的角色。它过滤所有的I/O事件和请求,这些事件和请求由IoService最终到达IoHandler。 过滤器的生命周期:一个过滤器只有当它处于过滤器链中时才会起过滤作用。 当添加一个过滤器到过滤器链时: a. ReferenceCountingIoFilter在第一时间调用init()方法。 b. 调用onPreAdd方法来告知程序,一个过滤器将被添加到过滤器链中。 c. 当过滤器被添加到过滤器链后,所有的事件和I/O请求都会通过过滤器到达IoHandler。 d. 调用onPostAdd方法来告知程序,一个过滤器已被添加到过滤器链中。 e. 当onPostAdd方法 抛出异常时,过滤器将会从过滤器链中被删除,如果这个过滤器是整个过滤器链中的最后一个,那么ReferenceCountingIoFilter将会调用destory()销毁该过滤器。 当从过滤器链中移除过滤器时: a. 调用onPreRemove方法来告知程序,一个过滤器将会从过滤器链中被移除。 b. 过滤器从过滤器链中被移除后后,所有的事件和I/O请求都不会通过该过滤器到达IoHandler。 c. 调用onPostRemove方法来告知程序,一个过滤器已经从过滤器链中被移除。 d. 当这个过滤器是过滤器链中的最后一个过滤器时,那么ReferenceCountingIoFilter将会调用destory()销毁该过滤器。 嵌套类 static interface IoFilter.NextFilter Represents the next IoFilter in IoFilterChain. 过滤器链中的下个过滤器。 Static class IoFilter.WriteRequest Represents write request fired by IoSession.write(Object). 由IoSession.write(Object)发出的写请求。 方法 void destroy() 销毁此过滤器。由ReferenceCountingIoFilter调用 void exceptionCaught(IoFilter.NextFilter nextFilter, IoSession session, Throwable cause) 过滤IoHandler中的exceptionCaught事件。 void filterClose(IoFilter.NextFilter nextFilter, IoSession session) 过滤IoSession.close()方法。 void filterWrite(IoFilter.NextFilter nextFilter, IoSession session, IoFilter.WriteRequest 过滤IoSession.write(Object)方法。 void init() 当过滤器被添加到过滤器链中后调用该方法,这样可以在第一时间为其分配资源。由ReferenceCountingIoFilter调用 void messageReceived(IoFilter.NextFilter nextFilter, IoSession session, Object message) 过滤Iohandler中的messageReceived事件。 void messageSent(IoFilter.NextFilter nextFilter, IoSession session, Object message) 过滤Iohandler中的messageSent事件。 void onPostAdd(IoFilterChain parent, String name, IoFilter.NextFilter nextFilter) 在这个过滤器被添加到过滤器链之后调用此方法。 void onPostRemove(IoFilterChain parent, String name, IoFilter.NextFilter nextFilter) 在这个过滤器从过滤器链中被删除之后调用此方法。 void onPreAdd(IoFilterChain parent, String name, IoFilter.NextFilter nextFilter) 在这个过滤器被添加到过滤器链之前调用此方法。 void onPreRemove(IoFilterChain parent, String name, IoFilter.NextFilter nextFilter) 在这个过滤器从过滤器链中被删除之前调用此方法。 void sessionClosed(IoFilter.NextFilter nextFilter, IoSession session) 过滤IoHandler中的sessionClosed事件。 void sessionCreated(IoFilter.NextFilter nextFilter, IoSession session) 过滤IoHandler中的sessionCreated事件。 void sessionIdle(IoFilter.NextFilter nextFilter, IoSession session, IdleStatus status) 过滤IoHandler中的sessionIdle事件。 void sessionOpened(IoFilter.NextFilter nextFilter, IoSession session) 过滤IoHandler中的sessionOpened事件。 MINA自身带有一些常用的过滤器,例如codec(字符编号)、LoggingFilter(日志记录)、 BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilter(SSL加密)等 l IoFilterAdapter(过滤器适配器),这个类只实现了IoFilter接口中的方法,但是方法中并没有做任何事。 l BlackListFilter(黑名单过滤器)是IoFileter的一个实现类,作用是将远程客户端添加到黑名单中后,该客户端就会访问不到服务器。 Method Summary void block(InetAddress address) 将指定地址的计算机添加黑名单中。 void block(InetAddress address, String error_string) 将指定地址的计算机添加黑名单中。 void setBlacklist(Collection addresses) 将多个指定地址添加到黑名单中。 void setBlacklist(InetAddress addresses) 将多个指定地址添加到黑名单中。 void unblock(InetAddress address) 将指定地址的计算机添加黑名单中 程序见附件: l LoggingFilter(日志过滤器),将此过滤器加到过滤器链中后就可以实现MINA的日志功能。程序见附件: l ProtocolCodecFilter(协议编解码过滤器),通过ProtocolCodecFactory,ProtocolEncoder,或ProtocolDecoder该过滤器可以实现普通的二进制或特殊的协议数据与POJO之间的相互转换。程序见附件: 构造方法 ProtocolCodecFilter(Class encoderClass, Class decoderClass) ProtocolCodecFilter(ProtocolCodecFactory factory) ProtocolCodecFilter(ProtocolEncoder encoder, ProtocolDecoder decoder) l 协议编码器(ProtocolEncoder)将高级的信息对象编码成二进制或特殊的协议数据。MINA会对位于IoSession写队列中的所有消息调用en code函数,然后编码器会 将经过编码处理过的消息放到ByteBuffer中,通过ProtocolEncoderOutput函数送出,到达过滤器链中的下个过滤器。 ProtocolEncoder中的方法 void dispose(IoSession session) 释放所有与这个编码器相关的资源。 void encode(IoSession session, Object message, ProtocolEncoderOutput out) 将高级的消息对象编码成二进制或特殊的协议数据 ProtocolEncoder的实现类 NettyEncoder 该编码器可以将Netty2信息编码成字节buffers ObjectSerializationEncoder 该编码器通过ByteBuffer.putObject(Object)可以编码普通的java类 新增方法 int getMaxObjectSize() Returns the allowed maximum size of the encoded object. 返回允许被编码的Object的最大限制 void setMaxObjectSize(int axObjectSize) Sets the allowed maximum size of the encoded object. 设置允许被编码的Object的最大限制 ProtocolEncoderAdapter ProtoclEncoder适配器。 SynchronizedProtocolEncoder, 线程方面的。 TextLineEncoder 该编码器可以将字符串按分隔符编码成一行一行的文本。 构造方法 TextLineEncoder() TextLineEncoder(Charset charset) 创建一个带有字符编码的实例 TextLineEncoder(Charset charset, LineDelimiter delimiter) 创建一个带有字符编码和分隔符的实例 TextLineEncoder(LineDelimiter delimiter) 创建一个带有分隔符的实例 新增方法 int getMaxLineLength() Returns the allowed maximum size of the encoded line. 返回每行的最大限制。 void setMaxLineLength(int maxLineLength) Sets the allowed maximum size of the encoded line. 设置每行的最大限制。 l 协议解码器(ProtocolDecoder)将二进制或特殊协议数据解码成高级的信息对象。MINA会对读出的数据调用decode函数,然后解码器会将经过解码处理过的消息通过ProtocolDecoderOutput函数送出,到达过滤器链中的下个过滤器。 ProtocolDecoder中的方法 void decode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) 将二进制或特殊的协议数据解码成高级的消息对象。 void dispose(IoSession session) 释放与这个解码器相关的所有资源。 void finishDecode(IoSession session, ProtocolDecoderOutput out) 当指定session回话关闭时调用此方法 ProtocolDecoder的实现类 NettyDecoder 该解码器通过使用指定MessageRecognizer可以将字节缓存解码成Netty2信息。 构造方法 NettyDecoder(net.gleamynode.netty2.MessageRecognizer recognizer) 创建一个带有指定MessageRecognizer的实例。 ObjectSerializationDecoder 该编码器通过ByteBuffer.getObject(Object)可以解码普通的java类 构造方法 ObjectSerializationDecoder() Creates a new instance with the ClassLoader of the current thread. 创建一个新的实例,使用当前线程的ClassLoader ObjectSerializationDecoder(ClassLoader classLoader) Creates a new instance with the specified ClassLoader. 创建一个带有指定ClassLoader的实例。 新增方法 int getMaxObjectSize() Returns the allowed maximum size of the encoded object. 返回允许被解码的Object的最大限制 void setMaxObjectSize(int axObjectSize) Sets the allowed maximum size of the encoded object. 设置允许被解码的Object的最大限制 ProtocolDecoderAdapter ProtoclDecoder适配器。 SynchronizedProtocolDecoder, 线程方面的。 TextLineDecoder 该解码器可以将一行一行的文本解码成字符串。 构造方法 TextLineDecoder() TextLineDecoder(Charset charset) 创建一个带有字符编码的实例 TextLineDecoder(Charset charset, LineDelimiter delimiter) 创建一个带有字符编码和分隔符的实例 TextLineDecoder(LineDelimiter delimiter) 创建一个带有分隔符的实例 新增方法 int getMaxLineLength() Returns the allowed maximum size of the encoded line. 返回每行的最大限制。 void setMaxLineLength(int maxLineLength) Sets the allowed maximum size of the encoded line. 设置每行的最大限制。 CumulativeProtocolDecoder 累计解码器,该解码器可以根据协议来解析当前数据是否为完整的数据,如果不完整的话,解码器会将当前数据保存到buffer中,然后等待后续的数据,知道所有的数据都到达后才将完整的数据一并送出。 示例程序: l 协议编解码工厂(ProtocolCodecFactory)提供编码解码器,可以实现字节与高级信息之间的相互转换。 方法 ProtocolDecoder getDecoder() 获取一个解码器 ProtocolEncoder getEncoder() 获取一个编码器 ProtocolCodecFactory的实现类 DemuxingProtocolCodecFactory NettyCodecFactory 提供基于Netty2信息的编解码器 ObjectSerializationCodecFactory 用来处理Object的编解码器。 TextLineCodecFactory 用来处理字符串的编解码器。 l 消息编码器(MessageEncoder)编码指定类型的消息。 Method Summary void encode(IoSession session, Object message, ProtocolEncoderOutput out) Encodes higher-level message objects into binary or protocol-specific data. 将高级信息编码成字节活特殊协议数据。 Set> getMessageTypes() Returns the set of message classes this encoder can encode. 获取这个编码器能够编码的消息类型 l 消息解码器(MessageDecoder)解码指定类型的消息 Field Summary Static MessageDecoderResult NEED_DATA 描述decodable(IoSession, ByteBuffer) 和 decode(IoSession, ByteBuffer, ProtocolDecoderOutput)的返回值 Static NOT_OK MessageDecoderResult 描述decodable(IoSession, ByteBuffer) 和 decode(IoSession, ByteBuffer, ProtocolDecoderOutput)的返回值 Static MessageDecoderResult OK 描述decodable(IoSession, ByteBuffer) 和 decode(IoSession, ByteBuffer, ProtocolDecoderOutput)的返回值 方法 MessageDecoderResult decodable(IoSession session, ByteBuffer in) 检查指定的buffer是否能被此解码器解码。 MessageDecoderResult decode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) 将字节或特殊协议内容解码成高级消息对象。 void finishDecode(IoSession session, ProtocolDecoderOutput out) Invoked when the specified session is closed while this decoder was parsing the data. 当指定Session回话关闭时调用此方法。 l CompressionFilter(数据压缩过滤器) l SSLFilter(SSL过滤器) l ExecutorFilter(线程执行过滤器) l ReferenceCountingIoFilter()具体叫什么名字翻译不上来,该过滤器的作用就是管理所有的过滤器,在某个过滤器不处于过滤器链中时调用disdroy()方法来销毁该过滤器,以释放其占用的资源。在某个过滤器被添加到过滤器链时,调用init()方法来初始化该过滤器,为其分配资源。 l StreamWriteFilter(输入流过滤器)使用此过滤器后可以通过IoSession.write(Object)直接向远程写InputStream。当一个输入流写入到session中后这个过滤器会从这个输入流中读取字节,放到ByteBuffer中,然后将这个ByteBuffer写入到下个过滤器中。当输入流被读完后,过滤器会调用NextFilter#messageSent(IoSession, Object)将原始的输入流写入到session,然后通过原始的IoFilter.WriteRequest通知WriteFuture。这个过滤器会忽略那些不是输入流的信息,这样的信息会直接被转送到下个过滤器。 应当注意的是这个过滤器不负责关闭输入流,我们应当在IoHandler.messageSent()的回调函数中关闭它。 程序见附件: 3.7 IoServiceListener监听器 IoServiceListener监听器的作用是监听其对应的IoService(IoAcceptor和IoConnector)中的事件。 Method Summary void serviceActivated(IoService service, SocketAddress serviceAddress, IoHandler handler, IoServiceConfig config) Invoked when a new service is activated by an IoService. 当一个新的service被激活时调用此方法 void serviceDeactivated(IoService service, SocketAddress serviceAddress, IoHandler handler, IoServiceConfig config) Invoked when a service is deactivated by an IoService. 当一个service被销毁解除时调用此方法 void sessionCreated(IoSession session) Invoked when a new session is created by an IoService. 当一个新的session建立时调用此方法 void sessionDestroyed(IoSession session) Invoked when a session is being destroyed by an IoService. 当一个session被销毁时调用此方法。 IoFutureListener监听器的作用是用来监听指定的IoFuture. Method Summary void operationComplete(IoFuture future) nvoked when the operation associated with the IoFuture has been completed. 当IoFuture操作完成时调用。 两个监听器示例程序: 4MINA开发的一般步骤 4.1服务器端: 4.1.1创建接收器(IoAcceptor) IoAcceptor acceptor = new SocketAcceptor();//建立基于socket通信的client接收器。 4.1.2Server的属性设置 SocketAcceptorConfig cfg = new SocketAcceptorConfig(); cfg.setReuseAddress(true); // 启用SO_REUSEADDR 套接字选项(作用:允许不同server socket可以监听同一个端口) cfg.getFilterChain().addLast("codec", new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); //获取过滤器链,并将指定的过滤器添加到过滤器链的最后位置。 cfg.getFilterChain().addLast( "logger", new LoggingFilter() ); //获取过滤器链,并将日志过滤器添加到过滤器链的最后位置。 4.1.3绑定地址(address)和业务处理器(handler)到server。 acceptor.bind(new InetSocketAddress( SERVER_PORT ), new ServerSessionHandler( ), cfg ); // 绑定address和handler, SERVER_PORT为端口号。 具体程序见附件: 4.2客户端 4.2.1创建连接器(IoConnector) SocketConnector connector=new SocketConnector();//创建一个基于Socket通信的链接器 4.2.2客户端属性设置 //创建连接器设置 SocketConnectorConfig cfg=new SocketConnectorConfig(); //设置连接超时时间 cfg.setConnectTimeout(CONNECT_TIMEOUT); //添加过滤器链 cfg.getFilterChain().addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory())); 4.2.3绑定地址(address)和业务处理器(handler)到客户端 //建立链接 connector.connect(new InetSocketAddress(HOSTNAME,PORT),new MinaClientSessionHandler(),cfg); 4.3编写业务处理类 在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。 IoHandlerAdapter 继承IoHandlerAdapter,程序见附件: DemexingIoHandler 我们可以使用DemexingIoHandler来将接收事件分配到指定的MessageHandler中,使用它的时候我们需要在server端添加指定的MessageHandler: MessageHandler ss=new MyMessage(); DemexingIoHandlerhandler=new DemexingIoHandler (); //添加一个用来出来String类型的的MessageHandler handler.addMessageHandler(String.class, ss); 这里添加了一个用来处理String类型的MessageHandler,当客户端发来String类型的信息时,Mina会自动的将接收事件转到指定的MessageHandler中的MessageReceive方法中。 细节参见附件: MinaTimeServer.java MyMessage.java ChainedIoHandler 我们可以使用ChainedIoHandler来定义一个链式的的处理器,作用是可以定义多个处理器,然后按一定的顺序处理接收事件 //创建一个处理器链 IoHandlerChain handlerChain=new IoHandlerChain(); //创建两个处理器命令 IoHandlerCommand first=new FirstCommand(); IoHandlerCommand second=new SecondCommand(); //将处理器命令添加到处理器链中 handlerChain.addLast("first", first); handlerChain.addLast("second", second); //创建一个 链式的处理器,将处理器连添加到链式处理器中。 ChainedIoHandler chained=new ChainedIoHandler(handlerChain); 具体细节参见附件: ChainServer.java FirstCommand.java SecondCommand.java SingleSessionIoHandlerDelegate SingleSessionIoHandlerDelegate是用来为每个新建的session回话分配一个新的handler. 详细参见附件: SingleSessionServer.java SingleSessionIoHandlerFactoryImp.java NewSingleSessionIoHandlerAdapter.java 5MINA 的基础架构 在图中的模块链中,IoService 便是应用程序的入口, IoAccepter 便是 IoService 的一个扩展接口。IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口。在上面的例子中,我们是这样使用 IoAccepter 的: IoAcceptor acceptor = new SocketAcceptor(); 相当于我们使用了 Socket 通讯方式作为服务的接入,当前版本的 MINA 还提供了除 SocketAccepter 外的基于数据报文通讯的 DatagramAccepter 以及基于管道通讯的 VmPipeAccepter。另外还包括串口通讯接入方式,目前基于串口通讯的接入方式已经在最新测试版的 MINA 中提供。你也可以自行实现 IoService 接口来使用自己的通讯方式。 而在上图中最右端也就是 IoHandler,这便是业务处理模块。在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。编写 Handler 类就是使用 MINA 开发网络应用程序的重心所在,相当于 MINA 已经帮你处理了所有的通讯方面的细节问题。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。 前面我们提到 IoService 是负责底层通讯接入,而 IoHandler 是负责业务处理的。那么 MINA 架构图中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一个用途却是必须的,那就是作为 IoService 和 IoHandler 之间的桥梁。IoHandler 接口中最重要的一个方法是 messageReceived,这个方法的第二个参数是一个 Object 型的消息,总所周知,Object 是所有 Java 对象的基础,那到底谁来决定这个消息到底是什么类型呢?答案也就在这个 IoFilter 中。在前面使用的例子中,我们添加了一个 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),这个过滤器的作用是将来自客户端输入的信息转换成一行行的文本后传递给 IoHandler,因此我们可以在 messageReceived 中直接将 msg 对象强制转换成 String 对象。 而如果我们不提供任何过滤器的话,那么在 messageReceived 方法中的第二个参数类型就是一个 byte 的缓冲区,对应的类是 org.apache.mina.common.ByteBuffer。虽然你也可以将解析客户端信息放在 IoHandler 中来做,但这并不是推荐的做法,使原来清晰的模型又模糊起来,变得 IoHandler 不只是业务处理,还得充当协议解析的任务。 MINA自身带有一些常用的过滤器,例如LoggingFilter(日志记录)、BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilter(SSL加密)等。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档