欢迎来到天天文库
浏览记录
ID:34724714
大小:146.68 KB
页数:15页
时间:2019-03-10
《nio.2入门异步通道api文件系统api》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、异步通道 提供支持连接、读取、以及写入之类非锁定操作的连接,并提供对已启动操作的控制机制。Java7中用于JavaPlatform(NIO.2)的MoreNewI/OAPIs,通过在 java.nio.channels 包中增加四个异步通道,从而增强了Java1.4中的NewI/OAPIs(NIO):·AsynchronousSocketChannel·AsynchronousServerSocketChannel·AsynchronousFileChannel·AsynchronousDatagramChannel这些类在风格上与NIO通道API很相似。他
2、们共享相同的方法与参数结构体,并且大多数对于NIO通道类可用的参数,对于新的异步版本仍然可用。主要区别在于新通道可使一些操作异步执行。异步通道API提供两种对已启动异步操作的监测与控制机制。第一种是通过返回一个 java.util.concurrent.Future 对象来实现,它将会建模一个挂起操作,并可用于查询其状态以及获取结果。第二种是通过传递给操作一个新类的对象,java.nio.channels.CompletionHandler,来完成,它会定义在操作完毕后所执行的处理程序方法。每个异步通道类为每个操作定义API副本,这样可采用任一机制。异步套接
3、字通道及特性首先,我们将了解 AsynchronousServerSocketChannel 和 AsynchronousSocketChannel 类。我们将看到的第一个例子将演示如何利用这些新的类来实施简单的客户端/服务器。第一步,我们要设置服务器。设置服务器打开 AsychronousServerSocketChannel 并将其绑定到类似于 ServerSocketChannel 的地址:AsynchronousServerSocketChannelserver=AsynchronousServerSocketChannel.open().bind(
4、null);方法 bind() 将一个套接字地址作为其参数。找到空闲端口的便利方法是传递一个 null 地址,它会自动将套接字绑定到本地主机地址,并使用空闲的 临时 端口。接下来,可以告诉通道接受一个连接:FutureacceptFuture=server.accept();这是与NIO的第一个不同之处。接受调用总会立刻返回,并且,——不同于 ServerSocketChannel.accept(),它会返回一个SocketChannel ——它返回一个 Future5、Channel> 对象,该对象可在以后用于检索AsynchronousSocketChannel。 Future 对象的通用类型是实际操作的结果。比如,读取或写入操作会因为操作返回读或写的字节数,而返回一个 Future。利用 Future 对象,当前线程可阻塞来等待结果:AsynchronousSocketChannelworker=future.get();此处,其阻塞超时时间为10秒:AsynchronousSocketChannelworker=future.get(10,TimeUnit.SECONDS);或者轮询操作的当前状态,6、还可取消操作:if(!future.isDone()){future.cancel(true);}cancel() 方法可利用一个布尔标志来指出执行接受的线程是否可被中断。这是个很有用的增强;在以前的Java版本中,只能通过关闭套接字来中止此类阻塞I/O操作。客户端设置接下来,要通过打开并连接与服务器之间的 AsynchronousSocketChannel,来设置客户端:AsynchronousSocketChannelclient=AsynchronousSocketChannel.open();client.connect(server.getLoca7、lAddress()).get();一旦客户端与服务器建立连接,可通过使用字节缓存的通道来执行读写操作,如清单1所示:清单1.使用读写字节缓存//sendamessagetotheserverByteBuffermessage=ByteBuffer.wrap("ping".getBytes());client.write(message).get();//readamessagefromtheclientworker.read(readBuffer).get(10,TimeUnit.SECONDS);System.out.println("Message:"8、+newString(readBuffer.arra
5、Channel> 对象,该对象可在以后用于检索AsynchronousSocketChannel。 Future 对象的通用类型是实际操作的结果。比如,读取或写入操作会因为操作返回读或写的字节数,而返回一个 Future。利用 Future 对象,当前线程可阻塞来等待结果:AsynchronousSocketChannelworker=future.get();此处,其阻塞超时时间为10秒:AsynchronousSocketChannelworker=future.get(10,TimeUnit.SECONDS);或者轮询操作的当前状态,
6、还可取消操作:if(!future.isDone()){future.cancel(true);}cancel() 方法可利用一个布尔标志来指出执行接受的线程是否可被中断。这是个很有用的增强;在以前的Java版本中,只能通过关闭套接字来中止此类阻塞I/O操作。客户端设置接下来,要通过打开并连接与服务器之间的 AsynchronousSocketChannel,来设置客户端:AsynchronousSocketChannelclient=AsynchronousSocketChannel.open();client.connect(server.getLoca
7、lAddress()).get();一旦客户端与服务器建立连接,可通过使用字节缓存的通道来执行读写操作,如清单1所示:清单1.使用读写字节缓存//sendamessagetotheserverByteBuffermessage=ByteBuffer.wrap("ping".getBytes());client.write(message).get();//readamessagefromtheclientworker.read(readBuffer).get(10,TimeUnit.SECONDS);System.out.println("Message:"
8、+newString(readBuffer.arra
此文档下载收益归作者所有