⢠BIOï¼JDK1.4ä¹åçé»å¡IO
BIO,å³ä¸ºBlocking I/O,é»å¡IOï¼å¤§è´æµç¨ä¸º
1ï¼æå¡ç«¯å»ºç«ServerSocket,以ä¸ä¸ªç«¯å£å¯å¨ï¼2ï¼çå¾ å®¢æ·ç«¯å»ºç«socketè¿æ¥ï¼å¦æ没æè¿æ¥ï¼ä¸ç´é»å¡ï¼çå¾ ï¼ï¼3ï¼ä¸ä¸ªsocket建ç«è¿æ¥ä¹åï¼ä»çº¿ç¨æ± ä¸å»ä¸ä¸ªçº¿ç¨åå¤çsocket
对äºè¿ç§æ¨¡åçæ»ç»ï¼
缺ç¹ï¼å¦æ请æ±éè¿å¤§ï¼çº¿ç¨æ± ä¸å¤ç¨ï¼é£ä¹ä¼ä¸¥éå½±åæ§è½ã
ç®åtomcat I/O模åé»è®¤è¿æ¯BIOï¼å¯¹äºè¿æ¥ä¸å¤§çï¼ è¯¥æ¨¡å代ç ç¼åç®åï¼åªéè¦å ³æ³¨çº¿ç¨å çè¿æ¥å³å¯
public class BlockingIOServer {
public static void main(String[] args) throws IOException {
int port = ;
ExecutorService threadPool = Executors.newFixedThreadPool();
ServerSocket server = new ServerSocket(port);
while(true){
Socket client = server.accept();
//ä»çº¿ç¨æ± å线ç¨å¤çclient
threadPool.execute(()->{
try{
InputStream input = client.getInputStream();
//TODO read input
String req = null;
String res = "response:"+req;
//TODO response
client.getOutputStream().write(res.getBytes());
}catch(IOException e){
e.printStackTrace();
}finally {
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
}
â¢NIOï¼JDK1.4å以åççæ¬éé»å¡IO
å³æ¯Non Blocking I/O,éé»å¡IOï¼ jdk1.4ä¹åæä¾äºä¸å¥ä¸é¨çapi ä¸é¨æä½éé»å¡IO,æ¥å£ä»¥åç±»å®ä¹å¨java.nioå
NIO APIç±å个主è¦çé¨åç»æï¼ç¼å²åºï¼Buffersï¼ãééï¼Channelsï¼ãéæ©å¨ï¼Selector)æ¯å ¶æ ¸å¿ç»æç±»ã
NIO çå·¥ä½å¤§è´æµç¨ä¸ºï¼
⢠1ãéé注åä¸ä¸ªçå¬å°äºä»¶å¤çå¨
⢠2ãæäºä»¶åçæ¶ï¼äºä»¶å¤çå¨ä¼éç¥ç¸åºçééå¤ç
public class NonBlockingIOServer {
private int BLOCK = ;
private ByteBuffer sendBuffer = ByteBuffer.allocate(BLOCK);
private ByteBuffer receiveBuffer = ByteBuffer.allocate(BLOCK);
private Selector selector;
public NonBlockingIOServer(int port) throws IOException {
//1.open ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//2.configureBlocking false
serverSocketChannel.configureBlocking(false);
//3.bind port
serverSocketChannel.socket().bind(new InetSocketAddress(port));
//4.open Selector
selector = Selector.open();
//5.serverSocketChannel register select
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Server Start,port:"+port);
}
private void accept() throws IOException {
while (true) {
// 1.select,block
selector.select();
// 2.SelectionKey iterator
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
iterator.remove();
try {
doAccept(selectionKey);
} catch (IOException e) {
selectionKey.cancel();
e.printStackTrace();
}
}
}
}
private void doAccept(SelectionKey selectionKey)throws IOException{
if (selectionKey.isAcceptable()) {
// ServerSocketChannel ç selectionKey
ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
if(null == server){
return;
}
//æ¥åå°æ¤ééå¥æ¥åçè¿æ¥,block here
SocketChannel client = server.accept();
// é
置为éé»å¡
client.configureBlocking(false);
// 注å读å°selectorï¼çå¾
读çselectionKey
client.register(selector, SelectionKey.OP_READ);
} else if (selectionKey.isReadable()) {
// SocketChannel ç selectionKey
SocketChannel client = (SocketChannel) selectionKey.channel();
receiveBuffer.clear();
int count = client.read(receiveBuffer);
if (count > ) {
String receiveText = new String( receiveBuffer.array(),,count);
System.out.println(receiveText);
//注ååå°selectorï¼çå¾
读çselectionKey
SelectionKey key = client.register(selector, SelectionKey.OP_WRITE);
//è¿éå¯ä»¥ä½ä¸ºè®¾è®¡æ¡æ¶çæ©å±ä¹å¤
key.attach(receiveText);
}
} else if (selectionKey.isWritable()) {
// SocketChannel selectionKey
SocketChannel client = (SocketChannel) selectionKey.channel();
//ååºread ç attachment
String request = (String) selectionKey.attachment();
String sendText="response--" + request;
sendBuffer.clear();
sendBuffer.put(sendText.getBytes());
sendBuffer.flip();
//è¾åºå°éé
client.write(sendBuffer);
System.out.println(sendText);
client.register(selector, SelectionKey.OP_READ);
}
}
/**
* [[@param](http://my.oschina.net/u/2303379)](http://my.oschina.net/u/2303379) args
* [[@throws](http://my.oschina.net/throws)](http://my.oschina.net/throws) IOException
*/
public static void main(String[] args) throws IOException {
int port = ;
NonBlockingIOServer server = new NonBlockingIOServer(port);
server.accept();
}
}
代ç ä¸ç主è¦æµç¨ä¸ºï¼
â¢1ãopen ServerSocketChannel,configureBlocking falseï¼bind host and port
â¢2ãopen Selector
â¢3ãServerSocketChannel register on Selector
â¢4ãæ客æ·ç«¯è¿æ¥çäºä»¶åçï¼äºä»¶å¤çå¨éç¥ServerSocketChannelå»å¤ç
对è¿ä¸æ¨¡åçæ»ç»ï¼
â¢NIOæ¬èº«æ¯åºäºäºä»¶é©±å¨ææ³æ¥å®æç
â¢NIOåºäºSelectorï¼å½ææå ´è¶£çäºä»¶åçæ¶ï¼å°±éç¥å¯¹åºçäºä»¶å¤çå¨å»å¤çäºä»¶ï¼å¦æ没æï¼åä¸å¤çãå½socketææµå¯è¯»æå¯åå ¥socketæ¶ï¼æä½ç³»ç»ä¼ç¸åºçéç¥å¼ç¨ç¨åºè¿è¡å¤çï¼åºç¨åå°æµè¯»åå°ç¼å²åºæåå ¥æä½ç³»ç»ãæ以使ç¨ä¸ä¸ªçº¿ç¨å轮询就å¯ä»¥äº
â¢Buffer,ä¹æ¯NIOçä¸ä¸ªæ°ç¹æ§ï¼å¯ä»¥åç¶ç读/åæ°æ®ï¼æçå¾å°æ大çæé«ã
⢠JDK1.7ä¹åï¼AIOå¼æ¥éé»å¡Io
⢠â¦AIOï¼å³æ¯Asynchronous I/Oï¼å¼æ¥éé»å¡I/O
â¦JDK1.7ä¹åï¼ä¹å«ä½AIOï¼å·¥ä½æ¹å¼æ¯å¼æ¥éé»å¡
AIO主è¦å·¥ä½æµç¨ä¸ºï¼
â¦å®¢æ·ç«¯åèµ·ä¸ä¸ªIOè°ç¨
â¦æå¡ç«¯æ¥åIOä¹åï¼å¼æ¥åè°æ¥æ¶æååçIOï¼ä¸ä¼é»æ¡å½å主æµç¨ï¼ä¸»æµç¨ç»§ç»æ¥åä¸ä¸ä¸ªè¯·æ±
public class AsynchronousIOServer {
private static Charset charset = Charset.forName("UTF-8");
public static void main(String[] args) {
int port = ;
int processors = Runtime.getRuntime().availableProcessors();
ExecutorService threadPool = Executors.newFixedThreadPool(processors);
try {
AsynchronousChannelGroup group = AsynchronousChannelGroup.withThreadPool(threadPool);
AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open(group);
server.bind(new InetSocketAddress(port));
doAccept(server);
group.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
System.out.println("close server");
System.exit();
}
}
private static void doAccept(AsynchronousServerSocketChannel server) {
server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
@Override
public void completed(AsynchronousSocketChannel client, Void attachment) {
server.accept(null, this);// accept next client connect
doRead(client, attachment);
}
@Override
public void failed(Throwable exc, Void attachment) {
exc.printStackTrace();
}
});
}
private static void doRead(AsynchronousSocketChannel client, Void attachment) {
ByteBuffer buffer = ByteBuffer.allocate();
client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
if (result <= ) {
try {
System.out.println("客æ·ç«¯æ线:" + client.getRemoteAddress().toString());
attachment = null;
} catch (IOException e) {
e.printStackTrace();
}
return;
}
attachment.flip();
String req = charset.decode(attachment).toString();
attachment.compact();
client.read(attachment, attachment, this);// next client read
/** do service code **/
System.out.println(req);
ByteBuffer resBuffer = ByteBuffer.wrap(("response:" + req).getBytes());
doWrite(client, resBuffer, resBuffer);
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
exc.printStackTrace();
}
});
}
private static <V> void doWrite(AsynchronousSocketChannel client, ByteBuffer resBuffer, ByteBuffer attachment) {
client.write(attachment, attachment, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
// TODO write success
if (result <= ) {
try {
System.out.println("客æ·ç«¯æ线:" + client.getRemoteAddress().toString());
attachment = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
exc.printStackTrace();
}
});
}
}
对äºè¿ä¸æ¨¡åçæ»ç»ï¼
⢠主è¦æµç¨ä¸º:
â¦1ãå建ä¸ä¸ªå¼æ¥éé»å¡æå¡ç«¯
â¦2ãæå¡ç«¯æ¥åä¸ä¸ªè¯·æ±ï¼å¼æ¥åè°æ¥åæååçIO请æ±ï¼ç¶å继ç»æ¥åä¸ä¸ä¸ªè¯·æ±
â¦3ãå¼æ¥åè°è¯·æ±çIOï¼è¯»å请æ±æ°æ®æååï¼å¼æ¥åè°è¯»ååçç»æï¼ç¶å继ç»è¯»ä¸é¢çæ°æ®ï¼ä¸ä¼é»å¡å½åIO读
â¦4ãå¼æ¥åè°ç读IOæ°æ®ï¼ç¶ååæ¥å¤çæ°æ®ï¼è¿éå¯è½æ¯è®¡ç®é»è¾ï¼æ以è¿éä¹æ¯æ§è½çç¶é¢ä¹å¤ï¼å¦ææ¯è®¡ç®å¯éåï¼AIO模åä¸éç¨ï¼å¤çå®æä¹åï¼å¼æ¥åæ°æ®å°IO请æ±
ç¹ç¹ï¼
AIOå½è¿è¡è¯»åæä½æ¶ï¼åªé¡»ç´æ¥è°ç¨APIçreadæwriteæ¹æ³å³å¯ãè¿ä¸¤ç§æ¹æ³å为å¼æ¥çã
â¢å¯¹äºè¯»æä½èè¨ï¼å½ææµå¯è¯»åæ¶ï¼æä½ç³»ç»ä¼å°å¯è¯»çæµä¼ å ¥readæ¹æ³çç¼å²åºï¼å¹¶å¼æ¥åè°éç¥åºç¨ç¨åºï¼
对äºè¿ä¸ç§æ¨¡å使ç¨åºæ¯çä¸äºæ»ç»ï¼
⢠BIOæ¹å¼éç¨äºè¿æ¥æ°éå°ï¼è¿æ¥æ¶é´çï¼è®¡ç®å¯éï¼ä»£ç ç¼åç´è§ï¼ç¨åºç´è§ç®åæç解ï¼JDK1.4ä¹åã
⢠NIOæ¹å¼éç¨äºè¿æ¥æ°é大ï¼è¿æ¥æ¶é´çï¼æ¯å¦Httpæå¡å¨ï¼å¹¶åå±éäºåºç¨ä¸ï¼ç¼ç¨æ¯è¾å¤æï¼JDK1.4å¼å§æ¯æã
⢠AIOæ¹å¼ä½¿ç¨äºè¿æ¥æ°é大ï¼è¿æ¥æ¶é´é¿ï¼IOå¯éåï¼æ¯å¦è天æå¡å¨ï¼å åè°ç¨OSåä¸å¹¶åæä½ï¼ç¼ç¨æ¯è¾å¤æï¼JDK7å¼å§æ¯æã