lecture4非阻塞通信.ppt_第1页
lecture4非阻塞通信.ppt_第2页
lecture4非阻塞通信.ppt_第3页
lecture4非阻塞通信.ppt_第4页
lecture4非阻塞通信.ppt_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章非阻塞通信、主要内容、线程阻塞概念Java.nio包类简介:实施阻塞模式和非阻塞模式(例如服务器套接字通道套接字通道选择器/selection key/bytebuffer)2,或其他线程2,线程运行同步代码3,线程运行对象的wait()方法,只有其他线程可以唤醒该对象的notify()或notifyAll()方法4,线程执行I/O操作(例如ReadLine等),客户端线程返回2。线程从套接字的输入流读取数据时,如果没有足够的数据,它将处于阻塞状态,直到读取足够的数据或达到输入流的结束或异常。输入流的其他读取方法: int read():输入一个字节就足够了。int read(byte

2、buff):输入流字节数与数组长度相同。String readLine():输入流中的字符串行已足够。需要BufferReader的牙齿方法,如果客户端节目线程进入阻塞状态,则为3,线程从套接字的输出流写入数据时进入阻塞状态,等待所有数据输出,或者可能引发异常。如果输出流的write()方法返回4,异常中止,或者在调用Socket的close()方法时将Socket设置为关闭,则服务器线程阻塞状态,1,执行线程ServerSocket的accept()方法2,线程将数据从套接字的输入流关闭如果未阻止此类输入/输出流的读取和写入操作,则称为非阻塞I/o,4.1.2服务器多线程处理阻塞通信限制,创

3、建服务器套接字,接收连接套接字,将作业委派给工作线程, /非阻塞IF(套接字输出流可写数据)将数据写入/非阻塞输出流,Java.nio包的主要类,支持阻塞和非阻塞通信的以下类服务器套接字通道3360服务器套接字的替代类,支持阻塞和非阻塞通信套接字通道3360套接字替代类:SelectionKey: SelectionKey对象(Java.nio包的基类)位于selector对象的selector对象的Selector中时,向Selector注册表示ServerSocketChannel和SocketChannel的事件的句柄,Java.nio包的关键类,如何注册事件?在Selector中注册以

4、接收ServerSocketChannel牙齿连接准备事件的代码如下所示:注册事件进程selection key=server socket channel . register(Selector、selection key、Java.nio程序包中的关键类,interface channel,interface牙齿委托进程有时称为注册事件进程,SelectionKey中的某些静态常量表示只有一个事件可以在事件类型ServerSocketChannel中激发。SelectionKey。OP_ACCEPT:至少具有一个客户连接,并且接收指示服务器可以接收连接的就绪事件。SelectionKey类

5、静态常量事件类型,SocketChannel可能发生的三个茄子事件:SelectionKey。OP_CONNECT:表示客户与服务器之间的连接已成功建立的连接准备事件。SelectionKey。OP_READ:输入流中已包含可读取数据的准备读取事件。您可以执行读取操作。SelectionKey。OP_WRITE:准备写入事件。可以将数据写入输出流。SocketChannel接收和发送数据的方法,读取(ByteBuffer buffer):接收数据并将其存储在参数中指定的ByteBuffer中。Write(ByteBuffer Buffer):传输参数中指定的buffer的数据。ByteBuff

6、er表示字节缓冲区,这两种方法都可以操作。继承自Buffer类。特定基本类型元素的线性有限序列ByteBuffer中存储的字节。转换为字符串需要表示字符编码的Charset类。提供将字节流转换为字符串和字符串的方法。缓冲区缓冲区、数据输入和输出通常是耗时的操作。缓冲区可以提高两个茄子的I/o操作效率,从而减少物理读取和写入的实际次数。缓冲区在创建时分配内存。牙齿内存始终重复使用,以减少动态分配和回收次数。缓冲区属性:容量、限制、位置。相应的方法:clear()、flip()、rewind()、缓冲区无法读取和写入超出限制的区域。读取或写入时渡边杏的第一个元素的索引位置。下一个要读取或写入的元素

7、的索引、更改属性、clear()方法:清除缓冲区。将位置设置为0,将限制设置为牙齿容量,然后删除显示。读取串行通道或put操作填充牙齿缓冲区之前调用牙齿方法。示例:buf . clear();/prepare buffer for reading in。读取(buf);/Read data牙齿方法不能真正清除缓冲区中的数据,但在大多数情况下,它用于清除数据,更改属性,filp()方法:反转缓冲区,因此好像可以从名称中清除。首先,设置当前位置的限制,然后将该位置设置为0。如果已经定义了标记,则将忽略该标记。读取串行通道或put操作后,调用牙齿方法以执行串行通道写入或相对get操作。示例:buf.

8、put(魔术);/Prepend header in . read(buf);/read data into rest of buffer buf . flip();/Flip buffer out . write(buf);/Write header data to channel、更改属性、rewind()方法:准备缓冲区以重新读取已包含的数据。也就是说,保持限制不变,并将位置设置为0。重新缠绕牙齿缓冲区。将位置设置为零,然后删除标记。在写入串行通道或执行get操作之前调用牙齿方法(假定已正确设置限制)。例如:out . write(buf);/Write remaining data b

9、uf . rewind();/rewindbufferbuf.get(阵列);/copy data into array、bufferdemo、import Java . io . file input stream;import Java . io . fileoutputstream;import Java . nio . bytebuffer;import Java . nio . channels . file channel;buffer demo、publicclassbufferdemo publicstatic voidmain(string args)throws excep

10、tion./非直接缓冲bytebufferbb分配/0到100之间的字节格式for(inti=0;I100I).byteb=(byte)(math . random()* 100);bb . put(b);System.out.println(档案写入前缓冲区数据);bb . flip();while(bb . has remaining()system . out . print(bb . get();System.out.println(“已读取缓冲区数据”);与Bufferdemo,/buffer.txt文件关联的通道file channel fc=new file output str

11、eam(buffer . txt)。将getchannel (/缓冲区数据写入文件中的bb.flip()。fc . write(bb);/fc.force防止缓存(true);/关闭通道fc . close();Bb=空;Fc=空;Bufferdemo,/从文件读取数据fc=new file input stream(buffer . txt)。get channel();bytebufferbb 2=bytebuffer . allocate(int)fc . size();fc . read(bb2);System.out.println(从文件读取的缓冲区数据);bb2 . flip()

12、;while(bb2 . has remaining()system . out . print(bb2 . get();system . out . print ln();fc . close();Bb2=空;Fc=空;缓冲区Buffer生成方法,Buffer类是抽象类,共有8个特定缓冲区类。最基本的缓冲区是ByteBuffer,存储的数据单位是字节。ByteBuffer类不提供公共构造方法。但是,获取ByteBuffer实例的两个茄子静态工厂方法allocate(int capacity):返回容量缓冲区direct allocate(int capacity):从而返回容量int ind

13、ex(get)。put():相对写入。将单元格中的数据写入缓冲区中的当前位置,然后在该位置添加1。插入索引(Put)。还有另一个compact()方法。删除读取或写入的数据,并将剩馀数据从0放入limit-position区域。缓冲区Buffer生成方法;Buffer类是抽象类提示:计算机的信息存储单位(1)位(Bit):表示二进制数字0或1,是计算机存储处理信息的最基本单位。(2)字节:一个字节由8位组成。表示八个二进制代码,即完整的处理单元。现在电脑上使用了很多美国国家信息更换标准代码ASCII代码(由美国国家标准委员会制定)。例如,字符“A”的二进制编码为“010000001”,即41H或65D“#”的二进制编码为“0010 0011”,即23H或35H。一般说,16位是一个单词,32位是一个单词,64位是两个单词。字符编码charset,byte buffer encode(string str)byte buffer encod

温馨提示

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

最新文档

评论

0/150

提交评论