底层架构-远程通讯-Mina.docx_第1页
底层架构-远程通讯-Mina.docx_第2页
底层架构-远程通讯-Mina.docx_第3页
底层架构-远程通讯-Mina.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

底层架构-远程通讯-Mina一:Mina概要 Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。如下的特性:1、 基于Java nio的TCP/IP和UDP/IP实现基于RXTX的串口通信(RS232)VM 通道通信2、通过filter接口实现扩展,类似于Servlet filters3、low-level(底层)和high-level(高级封装)的api: low-level:使用ByteBuffers High-level:使用自定义的消息对象和解码器4、Highly customizable(易用的)线程模式(MINA2.0 已经禁用线程模型了): 单线程 线程池 多个线程池5、基于java5 SSLEngine的SSL、TLS、StartTLS支持6、负载平衡7、使用mock进行单元测试8、jmx整合9、基于StreamIoHandler的流式I/O支持10、IOC容器的整合:Spring、PicoContainer11、平滑迁移到Netty平台二:实践 首先讲一下客户端的通信过程: 客户端通信过程1.通过SocketConnector同服务器端建立连接2.链接建立之后I/O的读写交给了I/O Processor线程,I/O Processor是多线程的3.通过I/O Processor读取的数据经过IoFilterChain里所有配置的IoFilter,IoFilter进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议4.最后IoFilter将数据交给Handler进行业务处理,完成了整个读取的过程5.写入过程也是类似,只是刚好倒过来,通过IoSession.write写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤和协议的转换,最后通过I/O Processor将数据写出到socket通道IoFilterChain作为消息过滤链1.读取的时候是从低级协议到高级协议的过程,一般来说从byte字节逐渐转换成业务对象的过程2.写入的时候一般是从业务对象到字节byte的过程IoSession贯穿整个通信过程的始终1.创建服务器 packagecom.gewara.web.module.base;importjava.io.IOException;.InetSocketAddress;importjava.nio.charset.Charset;importorg.apache.mina.core.service.IoAcceptor;importorg.apache.mina.filter.codec.ProtocolCodecFilter;importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;importorg.apache.mina.filter.logging.LoggingFilter;importorg.apache.mina.transport.socket.nio.NioSocketAcceptor;/* Mina服务器 * *authormike * *since2012-3-15*/publicclassHelloServer privatestaticfinalintPORT = 8901;/定义监听端口publicstaticvoidmain(String args)throwsIOException /创建服务端监控线程 IoAcceptor acceptor =newNioSocketAcceptor(); /设置日志记录器 acceptor.getFilterChain().addLast(logger,newLoggingFilter(); /设置编码过滤器 acceptor.getFilterChain().addLast(codec,newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName(UTF-8); /指定业务逻辑处理器 acceptor.setHandler(newHelloServerHandler(); /设置端口号 acceptor.setDefaultLocalAddress(newInetSocketAddress(PORT); /启动监听线程 acceptor.bind(); 2.创建服务器端业务逻辑 packagecom.gewara.web.module.base;importorg.apache.mina.core.service.IoHandlerAdapter;importorg.apache.mina.core.session.IoSession;/* 服务器端业务逻辑 * *authormike * *since2012-3-15*/publicclassHelloServerHandlerextendsIoHandlerAdapter Override /* * 连接创建事件 */publicvoidsessionCreated(IoSession session) /显示客户端的ip和端口 System.out.println(session.getRemoteAddress().toString(); Override /* * 消息接收事件 */publicvoidmessageReceived(IoSession session, Object message)throwsException String str = message.toString(); if(str.trim().equalsIgnoreCase(quit) /结束会话 session.close(true); return; /返回消息字符串 session.write(Hi Client!); /打印客户端传来的消息内容 System.out.println(Message written + str); 3.创建客户端 packagecom.gewara.web.module.base;.InetSocketAddress;importjava.nio.charset.Charset;importorg.apache.mina.core.future.ConnectFuture;importorg.apache.mina.filter.codec.ProtocolCodecFilter;importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;importorg.apache.mina.filter.logging.LoggingFilter;importorg.apache.mina.transport.socket.nio.NioSocketConnector;/* Mina客户端 * *authormike * *since2012-3-15*/publicclassHelloClient publicstaticvoidmain(String args) /创建客户端连接器. NioSocketConnector connector =newNioSocketConnector(); /设置日志记录器 connector.getFilterChain().addLast(logger,newLoggingFilter(); /设置编码过滤器 connector.getFilterChain().addLast(codec, newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName(UTF-8); /设置连接超时检查时间 connector.setConnectTimeoutCheckInterval(30); /设置事件处理器 connector.setHandler(newHelloClientHandler(); /建立连接 ConnectFuture cf = connector.connect(newInetSocketAddress(9, 8901); /等待连接创建完成 cf.awaitUninterruptibly(); /发送消息 cf.getSession().write(Hi Server!); /发送消息 cf.getSession().write(quit); /等待连接断开 cf.getSession().getCloseFuture().awaitUninterruptibly();/释放连接 connector.dispose(); 4.客户端业务逻辑packagecom.gewara.web.module.base;importorg.apache.mina.core.service.IoHandlerAdapter;importorg.apache.mina.core.session.IoSession;publicclassHelloClientHandlerextendsIoHandlerAdapter Override /* * 消息接收事件 */publicvoidmessageReceived(IoSession session, Object message)throwsException /显示接收到的消息 System.out.println(server message:+message.toString(); 5.先启动服务器端,然后启动客户端2012-03-15 14:45:41,456 INFO logging.LoggingFilter - CREATED /9:2691 2012-03-15 14:45:41,456 INFO logging.LoggingFilter - OPENED 2012-03-15 14:45:41,487 INFO logging.LoggingFilter - RECEIVED: HeapBufferpos=0 lim=11 cap=2048: 48 69 20 53 65 72 76 65 72 21 0A 2012-03-15 14:45:41,487 DEBUG codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVEDforsession 1 Message writtenHi Server! 2012-03-15 14:45:41,487 INFO logging.LoggingFilter - SENT: HeapBufferpos=0 lim=0 cap=0: empty 2012-03-15 14:45:41,487 INFO logging.LoggingFilter - RECEIVED: HeapBufferpos=0 lim=5 cap=2048: 71 75 69 74 0A 2012-03-15 14:45:41,487 DEBUG codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVEDforsession 1 2012-03-15 14:45:41,487 INFO logging.LoggingFilter - CLOSED三:分析源码1.首先看服务器 /创建服务端监控线程 IoAcceptor acceptor =newNioSocketAcceptor(); /设置日志记录器 acceptor.getFilterChain().addLast(logger,newLoggingFilter(); /设置编码过滤器 acceptor.getFilterChain().addLast(codec,newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName(UTF-8); /指定业务逻辑处理器 acceptor.setHandler(newHelloServerHandler(); /设置端口号 acceptor.setDefaultLocalAddress(newInetSocketAddress(PORT); /启动监听线程 acceptor.bind();1)先创建NioSocketAcceptornio的接收器,谈到Socket就要说到Reactor模式 当前分布式计算Web Services盛行天下,这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构:1. Read request2. Decode request3. Process service4. Encode reply5. Send reply但这种模式在用户负载增加时,性能将下降非常的快。我们需要重新寻找一个新的方案,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论