import
java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Iterator;
import java.util.Set;
public class MainClass {
public static void main ( String [] args ) throws IOException {
Charset charset = Charset.forName ( "ISO-8859-1" ) ;
CharsetEncoder encoder = charset.newEncoder () ;
CharsetDecoder decoder = charset.newDecoder () ;
ByteBuffer buffer = ByteBuffer.allocate ( 512 ) ;
Selector selector = Selector.open () ;
ServerSocketChannel server = ServerSocketChannel.open () ;
server.socket () .bind ( new java.net.InetSocketAddress ( 8000 )) ;
server.configureBlocking ( false ) ;
SelectionKey serverkey = server.register ( selector, SelectionKey.OP_ACCEPT ) ;
for ( ;; ) {
selector. select () ;
Set keys = selector.selectedKeys () ;
for ( Iterator i = keys.iterator () ; i.hasNext () ; ) {
SelectionKey key = ( SelectionKey ) i.next () ;
i.remove () ;
if ( key == serverkey ) {
if ( key.isAcceptable ()) {
SocketChannel client = server.accept () ;
client.configureBlocking ( false ) ;
SelectionKey clientkey = client.register ( selector, SelectionKey.OP_READ ) ;
clientkey.attach ( new Integer ( 0 )) ;
}
} else {
SocketChannel client = ( SocketChannel ) key.channel () ;
if ( !key.isReadable ())
continue ;
int bytesread = client.read ( buffer ) ;
if ( bytesread == - 1 ) {
key.cancel () ;
client.close () ;
continue ;
}
buffer.flip () ;
String request = decoder.decode ( buffer ) .toString () ;
buffer.clear () ;
if ( request.trim () .equals ( "quit" )) {
client.write ( encoder.encode ( CharBuffer.wrap ( "Bye." ))) ;
key.cancel () ;
client.close () ;
} else {
int num = (( Integer ) key.attachment ()) .intValue () ;
String response = num + ": " + request.toUpperCase () ;
client.write ( encoder.encode ( CharBuffer.wrap ( response ))) ;
key.attach ( new Integer ( num + 1 )) ;
}
}
}
}
}
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Iterator;
import java.util.Set;
public class MainClass {
public static void main ( String [] args ) throws IOException {
Charset charset = Charset.forName ( "ISO-8859-1" ) ;
CharsetEncoder encoder = charset.newEncoder () ;
CharsetDecoder decoder = charset.newDecoder () ;
ByteBuffer buffer = ByteBuffer.allocate ( 512 ) ;
Selector selector = Selector.open () ;
ServerSocketChannel server = ServerSocketChannel.open () ;
server.socket () .bind ( new java.net.InetSocketAddress ( 8000 )) ;
server.configureBlocking ( false ) ;
SelectionKey serverkey = server.register ( selector, SelectionKey.OP_ACCEPT ) ;
for ( ;; ) {
selector. select () ;
Set keys = selector.selectedKeys () ;
for ( Iterator i = keys.iterator () ; i.hasNext () ; ) {
SelectionKey key = ( SelectionKey ) i.next () ;
i.remove () ;
if ( key == serverkey ) {
if ( key.isAcceptable ()) {
SocketChannel client = server.accept () ;
client.configureBlocking ( false ) ;
SelectionKey clientkey = client.register ( selector, SelectionKey.OP_READ ) ;
clientkey.attach ( new Integer ( 0 )) ;
}
} else {
SocketChannel client = ( SocketChannel ) key.channel () ;
if ( !key.isReadable ())
continue ;
int bytesread = client.read ( buffer ) ;
if ( bytesread == - 1 ) {
key.cancel () ;
client.close () ;
continue ;
}
buffer.flip () ;
String request = decoder.decode ( buffer ) .toString () ;
buffer.clear () ;
if ( request.trim () .equals ( "quit" )) {
client.write ( encoder.encode ( CharBuffer.wrap ( "Bye." ))) ;
key.cancel () ;
client.close () ;
} else {
int num = (( Integer ) key.attachment ()) .intValue () ;
String response = num + ": " + request.toUpperCase () ;
client.write ( encoder.encode ( CharBuffer.wrap ( response ))) ;
key.attach ( new Integer ( num + 1 )) ;
}
}
}
}
}
}
1,selector不断的轮流检查所有准备就绪的channel,发现就绪了就开始做相关的动作,该动作往往是阻塞式的。而轮询检查channel是否就绪是非阻塞式的。
这就是所谓的非阻塞的io。
2,数据从channel先读取到buffer中,然后再从buffer中取数据。这就是所谓的面向缓存的io。