Java分布式学习资料:lesson-3- Distributed App Development Based on Message_第1页
Java分布式学习资料:lesson-3- Distributed App Development Based on Message_第2页
Java分布式学习资料:lesson-3- Distributed App Development Based on Message_第3页
Java分布式学习资料:lesson-3- Distributed App Development Based on Message_第4页
Java分布式学习资料:lesson-3- Distributed App Development Based on Message_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、Distributed App Development Based on Message图示单击此处添加段落文字内容1dsds此处添加段落文字内容2单击此处添加段落文字内容3单击此处添加段落文字内容4Distributed Java Application 大型应用系统通常由多个子系统组成。对于Java而言,这些子系统可能部署在同一台机器多个不同的JVM中,也可能部署在不同机器。而这些子系统又不是完全独立,需要相互通信来共同实现业务功能。 Communication Based on Message 当系统间要通信时,需要向外发送消息。消息可以是字节流、字节数组、Java对象。其它系统接收到消

2、息后则进行相应的业务处理。 通常基于TCP/IP和UDP/IP网络协议实现系统间的通信。Cond. 当系统间要通信时,需要向外发送消息。消息可以是字节流、字节数组、Java对象。其它系统接收到消息后则进行相应的业务处理。 TCP/IP是一种可靠的网络数据传输协议。它要求通信双方首先建立连接,之后进行数据传输。TCP/IP保证数据传输的可靠性,包括数据的可到达、数据到达的顺序等。Cond. UDP/IP是一种不保证数据一定到达的网络数据传输协议。UDP/IP并不直接给通信双方建立连接,而是发到网络上进行传输。UDP/IP不建立连接,不保证数据传输的可靠性,传输性能好,可能会出现数据丢失、据乱序等

3、问题。Cond. UDP/IP是一种不保证数据一定到达的网络数据传输协议。UDP/IP并不直接给通信双方建立连接,而是发到网络上进行传输。UDP/IP不建立连接,不保证数据传输的可靠性,传输性能好,可能会出现数据丢失、据乱序等问题。Cond. TCP/IP、UDP/IP用于完成数据传输。通信需要对数据进行处理,POSIX标准分为同步IO和异步IO,其中同步IO用得最多的是BIO(Blocking)和NIO(Non-blocking). BIO就是当发起IO的读写操作时,均为阻塞方式,只有当程序读到流或将流写入操作系统后,才会释放资源。Cond. NIO就是采用Reactor模式,发起IO的读或

4、写操作时,是非阻塞方式。当Socket有流可读或可写Socket时,操作会通知应用程序处理,应用程序将流读取到缓冲区或写入操作系统。 Java7以前的版本只支持BIO和NIO.Cond. AIO就是采用Proactor模式。调用API的read或write读写数据。当有流可读取时,操作系统会将可读的流传入对于read方法的缓冲区,通知应用程序处理。对于写操作而言,操作系统将write方法传递的写完时,操作系统通知应用程序。AIO省略了NIO遍历通知队列Selector的开销。Communication via Message Four types: TCP/IP+BIO, TCP/IP+NIO

5、, UDP/IP+BIO, and UDP/IP+NIO. TCP/IP+BIO 利用Java的Socket, ServerSocket实现TCP/IP+BIO的系统间通信。 ServerSocket用于实现服务器端口的监听和Socket对象的获取。Cond. /创建连接Socket socket = new Socket(目标IP地址域名,目标端口);/创建读取服务器端返回流的BufferedReader BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream( );Cond./创建

6、向服务器写入流的PrintWriterPrintWriter in = new PrintWriter (new socket.getOutputStream( ), true);/向服务器发送字符串信息。这里即使写失败也不会抛出异常信息,并且一直会阻塞到写入操作系统或网络IO出现异常为止out.println(“Hello World”);Cond./阻塞读取服务器端的返回信息。这里即使写失败也不会抛出异常信息,并且一直会阻塞到写入操作系统或网络IO出现异常为止 In.readLine( ); /接受客户端建立连接的请求,返回Socket对象,和客户端进行交互。交互方式和客户端相同。TCP/

7、IP+BIO方法一直会阻塞到有新客户端发送建立连接请求。 Socket socket = ss.accept();Cond.TCP/IP+BIO方法一直会阻塞到有新客户端发送建立连接请求。若希望此方法多阻塞一段时间,在创建ServerSocket后调用其setTimeout(以毫秒为单位的超时时间) TCP/IP+BIO不适合客户端同时发送多个请求到服务器的情况。因为过多的Socket消耗过多的服务器资源,频繁创建Socket连接导致系统性能下降。 Cond.TCP/IP+NIO利用java.nio.channels的Channel和Selector实现系统间的通信。Channel有Socke

8、tChannel和ServerChannel两种,SocketChannel用于建立连接、监听时间以及操作读写;ServerSocketChannel用于监听端口及监听连接事件。程序通过Selector获取是否有要处理的事件。Cond.SocketChannel channel = SocketChannel.open()/设置为非阻塞模式channel.configureBlocking(false);/对于非阻塞模式,立即返回false,表示连接正在建立之中channel.connect(SocketAddress);Selector selector = Selector.open( )

9、;Cond./向channel注册selector以及感兴趣的连接事件channel.register(selector, SelectionKey.OP_CONNECT)/阻塞至有感兴趣的IO事件发生,或到达超时时间。如果希望一直等至有感兴趣的IO事件发生,可调用无参数的select方法。如果希望不阻塞直接返回是否有感兴趣的事件发生,可调用selectNow方法。Int Keys = selector.select(以毫秒为单位的超时时间 )Cond.SelectionKey skey = null;If(nKeys 0) set keys = selector.selectedKeys(

10、);for(SelectionKey key; keys)/对于发生连续的事件 if(key.isConnectable() SocketChannel sc = (SocketChannel )key.channel(); sc.configureBlock(false); Cond./注册感兴趣的IO事件,通常不直接注册写事件。在发送缓冲区未满的情况下,一直是可写的。因此,如果注册了写事件,而又不用写数据,很容易造成CPU消耗100%的情况。 sc.finishConnect();/有流可读取Cond./有流可读取 else if(key.isReadable() ByteBuffer b

11、uffer = ByteBuffer .allocate(1024); SocketChannel sc = (SocketChannel )key.channel(); int readBytes = 0; try int ret = 0; try Cond./读取目前可读得流,sc.read返回的为成功复制到bytebuffer的字节数,此步为阻塞操作,值可能为0;当到达流结尾时,返回-1。 while( (ret = sc.read(buffer) 0) readBytes += ret; finally buffer.flip(); finally if(buffer ! = null

12、) buffer.clear(); Cond./可写入流 else if( key.is Writable() /取消对OP_WRITE事件的注册 erestOps(erestOps() & (SelectionKey.OP_WRITE) ) ; SocketChannel sc = (SocketChannel)key.channel(0; Cond./此步为阻塞操作,直到写入操作系统发送缓冲区或网络IO出现异常,返回成功写入的字节数,当操作系统的发送缓冲区已满,返回0。Int writtenedSize = sc.write(ByteBuffer) /如未写入,

13、则继续注册感兴趣的OP-WRITE事件If(writtenedSize = 0)KerestOps(erestOps() | | SelectionKey.OP_WRITE); Cond.Selector.selectedKeys().clear(); /对于要写入的流,可直接调用channel.write来完成。只有在未写入成功时才要注册OP_WRITE事件Int wSize = channel.wite(ByteBuffer) ;If(wSize = 0) erestOps(erestOps() | SelectionKey.OP_WR

14、ITE)Cond. NIO是典型的Reactor模式的事件,通过注册感兴趣的事件以及扫描是否有感兴趣的事件发生,从而执行相应的动作。 服务器端的关键代码:ServerSocketChannel ssc = ServerSocketChannel .open();ServerSocket serversocket = ssc.socket();Cond. /绑定要监听端口 serverSocket.bind(new InetSocketAddress(port); ssc.configureBlocking(false); 之后采取和客户端同样的方式对selector.select进行查询,只是

15、增加一个对key.isAcceptable的处理If(key.isAcceptable() ServerSocketChannel server = (ServerSocketChannel) key.channel();Cond. TCP/IP+NIO能做到通信不阻塞。采用的方式是服务器端返回的响应带有请求标识,客户端采用连接复用方式。即每个SocketChannel发送消息后,不用等响应便可继续发送消息。降低连接池内的资源争抢问题。 服务器端由一个线程监听连接事件,另一个或多个线程监听网络流读写事件。UDP/IP+BIO UDP/IP+BIO基于DatagramSocket和Datagra

16、mPacket实现。DatagramSocket负责监听端口及读写数据,DatagramPacket作为数据流对象进行通信。/由于UDP/IP是无连接的,双方通信时需启动一个监听端口,承担服务器职能。DatagramSocket serverSocket = new DatagramSocket(监听的端口);Contd.byte buffer = new byte65507;DatagramPacket recevePacket = new DatagramPacket( buffer, buffer.length);DatagramSocket socket = new DatagramS

17、ocket();DatagramPacket packet = new DatagramPacket(datas, dats.length, server, port);/阻塞发送packet到指定的服务器和端口,出现网络IO异常时抛出IOException,当连不上目标地址和端口时,抛出PortUnreachableExceptionContd.DatagramSocket.setSoTimeout(以毫秒为单位的超时时间); /设置读取流的超时时间serverSocket.receive(recePacket); 服务器端的代码和客户端结构基本一致。 UDP/IP+BIO不会有连接竞争。出

18、现多请求时,服务器端接收一个packet就放入一个线程处理。UDP/IP+NIO UDP/IP+NIO通过DatagramChannel和ByteBuffer实现UDP/IP+NIO,DatagramChannel负责监听端口及进行读写,ByteBuffer用于数据流传输。DatagramChannel receChannel = DatagramChannel .open();receChannel.configureBlocking(false);DatagramSocket socket = receChannel .socket();Socket.bind(new InetSOcketAddress(rport);UDP/IP+NIOSelector selector = Selector.open();receChannel

温馨提示

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

最新文档

评论

0/150

提交评论