标签:
channel与流的区别:
channel的主要实现:
- FileChannel
- DatagramChannel:UDP读写
- SocketChannel:TCP读写
- ServerSocketChannel
支持scatter/gather(分散和聚集)
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.read(bufferArray);
通道的创建:
除了FileChannel之外,都使用open创建。
FileChannel的创建如下:
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel();
Socket通道
分别对应java.net包中的Socket对象ServerSocket、Socket和DatagramSocket;Socket通道被实例化时,都会创建一个对等的Socket对象。
Socket通道可以运行非阻塞模式并且是可选择的,非阻塞I/O与可选择性是紧密相连的,这也正是管理阻塞的API要在 SelectableChannel中定义的原因。设置非阻塞非常简单,只要调用configureBlocking(false)方法即可。如果需要中 途更改阻塞模式,那么必须首先获得blockingLock()方法返回的对象的锁。
ServerSocketChannel实例:
1. 使用对等socket来bind监听。
2. 非阻塞状态下,accept在无连接时立即返回null
ByteBuffer buffer = ByteBuffer.wrap("Hello World".getBytes()); ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(new InetSocketAddress(12345)); ssc.configureBlocking(false); for (;;) { System.out.println("Waiting for connections"); SocketChannel sc = ssc.accept(); if (sc == null) TimeUnit.SECONDS.sleep(2000); else { System.out.println("Incoming connection from:" + sc.socket().getRemoteSocketAddress()); buffer.rewind(); sc.write(buffer); sc.close(); } }
非阻塞的read在无数据时立即返回0
标签:
原文地址:http://www.cnblogs.com/dorothychai/p/4178646.html