Java NIO 主要是Channel, SelectionKey, Selector 三个类之间的关系,下面的例子就是演示如果使用NIO来处理请求的:
/** *
*/
package dongzi.nio.exercise.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
/**
* @author kyle
*
*/
public class SelectSockets {
private static final int PORT_NUMBER = 1234;
/**
* @param args
*/
public static void main(String[] args) {
new SelectSockets().go(args);
}
private void go(String[] args) {
int port = PORT_NUMBER;
if (args.length > 0) {
try {
port = Integer.parseInt(args[0]);
} catch (Exception e) {
}
}
System.out.println("Listening port: " + PORT_NUMBER);
try {
Selector selector = Selector.open();
startServer(port, selector);
while (true) {
int n = selector.select();
if (n == 0) {
continue;
}
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
SocketChannel channel = server.accept();
registerChannel(selector, channel, SelectionKey.OP_READ);
sayHello(channel);
}
if (key.isReadable()) {
readDataFromChannel(key);
}
}
it.remove();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private ByteBuffer buffer = ByteBuffer.allocate(1024);
private void readDataFromChannel(SelectionKey key) throws IOException {
int count = 0;
SocketChannel channel = (SocketChannel) key.channel();
buffer.clear();
while ((count = channel.read(buffer)) > 0) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
buffer.clear();
}
if (count < 0) {
channel.close();
}
}
private void sayHello(SocketChannel channel) throws IOException {
if (channel == null) {
return;
}
buffer.clear();
ByteBuffer buffer = ByteBuffer.wrap("Hi, there \r\n".getBytes());
buffer.flip();
channel.write(buffer);
}
private void registerChannel(Selector selector, SocketChannel channel,
int opRead) throws IOException {
if (channel == null) {
return;
}
channel.configureBlocking(false);
channel.register(selector, opRead);
}
private void startServer(int port, Selector selector) throws IOException,
ClosedChannelException {
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
ServerSocket serverSocket = serverChannel.socket();
serverSocket.bind(new InetSocketAddress(port));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
}