Apache_Mina_Server_2.0中文参考手册V1.0

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ApacheMinaServer2.0中文参考手册中文参考手册中文参考手册中文参考手册李海峰李海峰李海峰李海峰((((QQ:61673110))))-Andrew830314@163.comApacheMinaServer是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA对象的序列化服务、虚拟机管道通信服务等),Mina可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina提供了事件驱动、异步(Mina的异步IO默认使用的是JAVANIO作为底层支持)操作的编程模型。Mina主要有1.x和2.x两个分支,这里我们讲解最新版本2.0,如果你使用的是Mina1.x,那么可能会有一些功能并不适用。学习本文档,需要你已掌握JAVAIOJAVAIOJAVAIOJAVAIO、JAVANIOJAVANIOJAVANIOJAVANIO、JAVAJAVAJAVAJAVASocketSocketSocketSocket、JAVAJAVAJAVAJAVA线程及并发库线程及并发库线程及并发库线程及并发库(java.util.concurrent(java.util.concurrent(java.util.concurrent(java.util.concurrent.*.*.*.*))))的知识。Mina同时提供了网络通信的Server端、Client端的封装,无论是哪端,Mina在整个网通通信结构中都处于如下的位置:可见Mina的API将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。同样的,无论是哪端,Mina的执行流程如下所示:(1.)IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立。(2.)IoProcessor:这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector,这是与我们使用JAVANIO编码时的一个不同之处,通常在JAVANIO编码中,我们都是使用一个Selector,也就是不区分IoService与IoProcessor两个功能接口。另外,IoProcessor负责调用注册在IoService上的过滤器,并在过滤器链之后调用IoHandler。(3.)IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write方向)与解码(read方向)等功能,其中数据的encode与decode是最为重要的、也是你在使用Mina时最主要关注的地方。(4.)IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。_______________________________________________________________________________1.1.1.1.简单的简单的简单的简单的TCPServerTCPServerTCPServerTCPServer::::(1.)(1.)(1.)(1.)第一步第一步第一步第一步::::编写编写编写编写IoServiceIoServiceIoServiceIoService按照上面的执行流程,我们首先需要编写IoService,IoService本身既是服务端,又是客户端,我们这里编写服务端,所以使用IoAcceptor实现,由于IoAcceptor是与协议无关的,因为我们要编写TCPServer,所以我们使用IoAcceptor的实现NioSocketAcceptor,实际上底层就是调用java.nio.channels.ServerSocketChannel类。当然,如果你使用了Apache的APR库,那么你可以选择使用AprSocketAcceptor作为TCPServer的实现,据传说ApacheAPR库的性能比JVM自带的本地库高出很多。那么IoProcessor是由指定的IoService内部创建并调用的,我们并不需要关心。publicclassMyServer{mainmainmainmain方法方法方法方法::::IoAcceptoracceptor=newNioSocketAcceptor();acceptor.getSessionConfig().setReadBufferSize(2048);acceptor.getSessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);acceptor.bind(newInetSocketAddress(9123));}这段代码我们初始化了服务端的TCP/IP的基于NIO的套接字,然后调用IoSessionConfig设置读取数据的缓冲区大小、读写通道均在10秒内无任何操作就进入空闲状态。(2.)(2.)(2.)(2.)第二步第二步第二步第二步::::编写过滤器编写过滤器编写过滤器编写过滤器这里我们处理最简单的字符串传输,Mina已经为我们提供了TextLineCodecFactory编解码器工厂来对字符串进行编解码处理。acceptor.getFilterChain().addLast(codec,newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName(UTF-8),LineDelimeter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())));这段代码要在acceptor.bind()方法之前执行,因为绑定套接字之后就不能再做这些准备工作了。这里先不用清楚编解码器是如何工作的,这个是后面重点说明的内容,这里你只需要清楚,我们传输的以换行符为标识的数据,所以使用了Mina自带的换行符编解码器工厂。(3.)(3.)(3.)(3.)第三步第三步第三步第三步::::编写编写编写编写IoHandlerIoHandlerIoHandlerIoHandler这里我们只是简单的打印Client传说过来的数据。publicclassMyIoHandlerextendsIoHandlerAdapter{//这里我们使用的SLF4J作为日志门面,至于为什么在后面说明。privatefinalstaticLoggerlog=LoggerFactory.getLogger(MyIoHandler.class);@OverridepublicvoidmessageReceived(IoSessionsession,Objectmessage)throwsException{Stringstr=message.toString();log.info(Themessagereceivedis[+str+]);if(str.endsWith(quit)){session.close(true);return;}}}然后我们把这个IoHandler注册到IoService:acceptor.setHandler(newMyIoHandler());当然这段代码也要在acceptor.bind()方法之前执行。然后我们运行MyServer中的main方法,你可以看到控制台一直处于阻塞状态,此时,我们用telnet127.0.0.19123访问,然后输入一些内容,当按下回车键,你会发现数据在Server端被输出,但要注意不要输入中文,因为Windows的命令行窗口不会对传输的数据进行UTF-8编码。当输入quit结尾的字符串时,连接被断开。这里注意你如果使用的操作系统,或者使用的Telnet软件的换行符是什么,如果不清楚,可以删掉第二步中的两个红色的参数,使用TextLineCodec内部的自动识别机制。_______________________________________________________________________________2.2.2.2.简单的简单的简单的简单的TCPTCPTCPTCPClientClientClientClient::::这里我们实现Mina中的TCPClient,因为前面说过无论是Server端还是Client端,在Mina中的执行流程都是一样的。唯一不同的就是IoService的Client端实现是IoConnector。(1.)(1.)(1.)(1.)第一步第一步第一步第一步::::编写编写编写编写IoServiceIoServiceIoServiceIoService并注册过滤器并注册过滤器并注册过滤器并注册过滤器publicclassMyClient{mainmainmainmain方法方法方法方法::::IoConnectorconnector=newNioSocketConnector();connector.setConnectTimeoutMillis(30000);connector.getFilterChain().addLast(codec,newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName(UTF-8),LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())));connector.connect(newInetSocketAddress(localhost,9123));}(2.)(2.)(2.)(2.)第三步第三步第三步第三步::::编写编写编写编写IoHandlerIoHandlerIoHandlerIoHandlerpublicclassClientHandlerextendsIoHandlerAdapter{privatefinalstaticLoggerLOGGER=LoggerFactory.getLogger(ClientHandler.class);privatefinalStringvalues;publicClientHandler(Stringvalues){this.values=values;}@OverridepublicvoidsessionOpened(IoSessionsession){session.write(values);}}注册IoHandler:connector.setHandler(newClientHandler(你好!\r\n大家好!));然后我们运行MyClient,你会发现MyServer输出如下语句:Themessagereceivedis[你好!]Themessagereceivedis[大家好!]我们看到服务端是按照收到两条消息输出的,因为我们用的编解码器是以换行符判断数据是否读取完毕的。_______________________________________________________________________________3.3.3.3.介绍介绍介绍介绍MinaMinaMinaMina的的的的TCPTCPTCPTCP的主要接口的主要接口的主要接口的主要接口::::通过上面的两个示例,你应该对Mina如何编写TCP/IP协议栈的网络通信有了一些感性的认识。(1.)(1.)(1.)(1.)IoServiceIoServiceIoServiceIoService::::这个接口是服务端IoAcceptor、客户端IoConnector的抽象,提供IO服务和管理IoSession的功能,它有如下几个常用的方法:A.A.A.A.TransportMetadatagetTransportMetadata()TransportMetadatagetTransportMetadata()TransportMetadatagetTransportMetadata()TransportMetadataget

1 / 47
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功