Mina文档 - 图文(4)

2019-03-04 13:23

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(\

new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); //获取过滤器链,并将指定的过滤器添加到过滤器链的最后位置。 cfg.getFilterChain().addLast( \

//获取过滤器链,并将日志过滤器添加到过滤器链的最后位置。

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(\ TextLineCodecFactory()));

4.2.3绑定地址(address)和业务处理器(handler)到客户端

//建立链接

connector.connect(new

MinaClientSessionHandler(),cfg);

InetSocketAddress(HOSTNAME,PORT),new

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(\handlerChain.addLast(\//创建一个 链式的处理器,将处理器连添加到链式处理器中。 ChainedIoHandler ChainedIoHandler(handlerChain); 具体细节参见附件: ChainServer.java chained=new 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加密)等。


Mina文档 - 图文(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:C语言期末笔试2009年1月A

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: