NIO即非同步非阻塞式IO,有如下几个特点:
1.创建一个线程负责处理IO事件和IO事件的分发
2.事件驱动机制,事件到达之后触发
3.线程之间通过wait、notify等方式通信,减少线程间切换
NIO客户端和服务端需都维护一个管理通道的对象selector,该对象能检测一个或多个通道channel上事件,服务端线程轮询selector,事件到达再处理。
服务端例程
package com.zjl.socket
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class NioServer {
private Selector selector;
public void initServer(int port) throws IOException {
ServerSocketChannel serverChannel = ServerSocketChannek.open():
serverChannel.configureBlocking(false);
serverChannek.configureBlocking(false);
serverChannel.socket( ).bind(new InetSocketAddress(port));
this.selector = Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCECPT);
}
public void listen( ) throws IOException {
System.outprintln("服务器启动成功“);
while(true) {
selector.select( );
Iterator ite = this.selector.selectedKeys( ).iterator( );
while(ite.hasNext( ) {
SelectionKey key = (SelectionKey) ite.next( );
ite.remove( );
if (key.isAcceptable( )) {
ServerSocketChannel server = (ServerSocketChannel) key.channel( );
SocketChannel channel =server.accept ( );
channel.configureBlocking(false);
channel.write(ByteBuffer.wrap(new String("12345678").getBytes( )));
channel.register(this.selector,SelectionKey.OP_READ); }
else if (key.isReadable ( )) {
read(key);
}
}
}
}
public void read(SelectionKey key) thows IOException {
SocketChannel channel = (SocketChannel) key.channel( );
ByteBuffer buffer = ByteBuffer.allocate(10);
channel.read(buffer);
byte[ ] data = buffer.array( );
String msg = new String(data).trim( );
ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes( ));
channel.write(outBuffer);
}
public static void main(String[ ] args) thows IOException {
AioServer server = new AioServer( );
server.initServer(8100);
server.listen( );
}
}