如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Java网络程序设计第七章非阻塞Socket通信7非阻塞Socket通信7.1阻塞和非阻塞通信7.1阻塞和非阻塞通信7.1阻塞和非阻塞通信服务器程序用多线程处理阻塞通信7.1阻塞和非阻塞通信工作线程并不是越多越好.如下图所示,保持适量的工作线程,会提高服务器的并发性能,但是当工作线程的数目达到某个极限,超出了系统的负荷时,反而会减低并发性能,使得多数客户无法快速得到服务器的响应.非阻塞通信的基本思想以上工作方式也可以运用到服务器程序中,服务器程序只需要一个线程就能同时负责接收客户的连接,接收各个客户发送的数据,以及向各个客户发送响应数据.服务器程序的处理流程如下:while(一直等待,直到有接收连接就绪事件,读就绪事件或写就绪事件发生){//阻塞if(有客户连接)接收客户的连接;//非阻塞if(某个Socket的输入流中有可读数据)从输入流中读数据;//非阻塞if(某个Socket的输出流可以写数据)向输出流写数据;//非阻塞}7.2非阻塞通信中的几个类SelectionKey、Selector与SelectableChannel之间的关联关系还需关注的(1)——Buffer缓冲区Buffer的使用两个方面提高IO操作的效率(减少实际的物理读写次数;减少动态分配和回收内存区域的次数)Java.nio包公开buffer类的APIbuffer的几个属性(都是非负值)容量(capacity):表示该缓冲区可以保存多少数据极限(limit):表示缓冲区目前的使用终点,使缓冲区便于重用位置(position):表示缓冲区中下一个读写单元的位置容量>=极限>=位置>=0改变3个属性的方法clear():把极限设为容量,把位置设为0;flip():把极限设为位置,再把位置设为0;rewind():不改变极限,把位置设为0;remaining():返回缓冲区的剩余容量,取值等于limit-positioncompact():删除0到位置的内容,然后把当前位置到极限limit的内容复制到0到limit-positon的区域内。当前位置position和极限limit的取值也作相应的变化ByteBuffer实例的方法compact():删除0到位置的内容,然后把当前位置到极限limit的内容复制到0到limit-positon的区域内。当前位置position和极限limit的取值也作相应的变化需要关注的(2)字符编码Charsetjava.nio.Charset解码:字节序列字符串Charbufferdecode(ByteBufferbb)编码:字符串字节序列ByteBufferencode(Stringstr);ByteBufferencode(CharBuffercb);静态工厂方法(无构造函数)Charset类的静态forName(Stringencode)方法返回一个Charset对象,它代表参数encode指定的编码类型.Charset.forName(Stringencode);Charsetcharset=Charset.forName(”GBK”);//创建了一个代表"GBK"编码的Charset对象:Charset.defaultCharset();//返回代表本地平台的默认字符编码的Charset对象内存Channel的主要层次结构java.nio.channels.Channel接口只声明了两个方法.close():关闭通道;isOpen():判断通道是否打开.通道在创建时被打开,一旦关闭通道,就不能重新打开了.Channel接口的两个最重要的子接口是ReadableByteChannel和WritableByteChannel.ReadableByteChannel接口声明了read(ByteBufferdst)方法,该方法把数据源的数据读入参数指定的ByteBuffer缓冲区中;WritableByteChannel接口声明了write(ByteBuffersrc)方法,该方法把参数指定的ByteBuffer缓冲区中的数据写到数据汇中.ScatteringByteChannel接口扩展了ReadByteChannel接口,允许分散地读取数据.分散读取数据是指单个读取操作能填充多个缓冲区.ScatteringByteChannel接口声明了read(ByteBuffer[]dsts)方法,该方法把从数据源读取的数据依次填充到参数指定的ByteBuffer数组的各个ByteBuffer中.GatheringByteChannel接口扩展了WritableByteChannel接口,允许集中地写入数据.集中写入数据是指单个写操