IO三種方式:BIO,NIO,AIO
(異步讀寫asynchronous IO)jdk1.6及之前都只實(shí)現(xiàn)BIO 和 NIOjdk1.7開始支持AIO,即NIO 2.0在BIO阻塞模式下server端:1 new ServerSocket(int port) 監(jiān)聽端口2 serverSocket.accept() 阻塞式等待客戶端的連接,有連接才返回Socket對(duì)象3 socket.getINputStream() 獲取客戶端發(fā)過來的信息流4 socket.getOutputStream() 獲取輸出流對(duì)象,從而寫入數(shù)據(jù)返回客戶端client端:1 newSocket(String host,int port) 建立與服務(wù)器端的連接,如果服務(wù)器沒啟動(dòng),報(bào)Connection refused異常2 socket.getInputStream() 讀取服務(wù)器端返回的流3 socket.getOutputStream() 獲取輸出流,寫入數(shù)據(jù)發(fā)送到服務(wù)器端在NIO模式下Server端:1 ServerSocketChannel.open() 獲取serverScoketChannel實(shí)例2 serverScoketChannel.configueBlocking(false) 設(shè)置channel為非阻塞模式3 serverSocketChannel.socket() 獲取serverSocket對(duì)象4 serverSocket.bind(port) 監(jiān)聽端口5 Selector.open() 打開Selector,獲取selector實(shí)例6 serverSocketChannel.register(Selector,int) 向selector注冊(cè)channel和感興趣的事件7 while(true) 循環(huán)以保證正常情況下服務(wù)器端一直處于運(yùn)行狀態(tài)8 selector.select() 獲取selector實(shí)例中需要處理的SelectionKey的數(shù)量9 for(SelectionKey key:selector.selectedKeys()) 遍歷selector.selectedKeys,以對(duì)每個(gè)SelectionKey的事件進(jìn)行處理10 key.isAcceptable() 判斷SelectionKey的類型是否為客戶端建立連接的類型11 key.channel() 當(dāng)SelectionKey的類型是acceptabel時(shí),獲取綁定的ServerSocketChannel對(duì)象12 serverSocketChannel.accept() 接受客戶端建立連接的請(qǐng)求,并返回SocketChannel對(duì)象13 socketChannel.regiseter(Selector,int) 向Selector注冊(cè)感興趣的事件類型,如read,write14 key.isReadable() 判斷SelectionKey是否為readable,如是則意味著有消息流在等待處理15 socketChannel.read(ByteBuffer) 從SelectionKey中綁定的SocketChannel對(duì)象讀取消息流16 socketChannel.write(ByteBuffer) 從SelectionKey中綁定的SocketChannel對(duì)象輸出消息流client端:
1 SocketChannel.open() 打開SocketChannel
2 SocketChannel.configureBlocking(false) 將SocketChannel配置為非阻塞模式
3 SocketChannel.connect(host,port) 連接到指定的目標(biāo)地址
4 Selector.open() 打開Selector
5 SocketChannel.register(Selector,int) 向Selector注冊(cè)感興趣的事件,connected,read,write
6 while(true) 循環(huán)執(zhí)行保證客戶端一直處于運(yùn)行狀態(tài)
7 Selector.select() 從Selector中獲取是否有可讀的key信息
8 for(SelectionKey key:selector.selectedKeys()) 遍歷selector中所有selectedKeys
9 SelectionKey.isConnectable() 判斷是否為連接建立的類型
10 SelectionKey.channel() 獲取綁定的SocketChannel
11 SocketChannel.finishConnect() 完成連接的建立(TCP/IP的三次握手)
12 SelectionKey.isReadable() 判斷是否為可讀類型
13 SelectionKey.channel() 獲取綁定的SocketChannel
14 SocketChannel.read(ByteBuffer) 從SocketChannel中讀取數(shù)到ByteBuffer中
15 SocketChannel.write(ByteBuffer) 向SocketChannel中寫入ByteBuffer對(duì)象數(shù)據(jù)