《構建高性能的大型分布式Java應用》筆記 第一章 IO
Posted on 2011-12-27 11:50 cooperzh 閱讀(491) 評論(0) 編輯 收藏 所屬分類: NIO 、讀書筆記IO三種方式:BIO,NIO,AIO (異步讀寫asynchronous IO)
jdk1.6及之前都只實現BIO 和 NIO
jdk1.7開始支持AIO,即NIO 2.0
在BIO阻塞模式下server端:
1 new ServerSocket(int port) 監聽端口
2 serverSocket.accept() 阻塞式等待客戶端的連接,有連接才返回Socket對象
3 socket.getINputStream() 獲取客戶端發過來的信息流
4 socket.getOutputStream() 獲取輸出流對象,從而寫入數據返回客戶端
client端:
1 newSocket(String host,int port) 建立與服務器端的連接,如果服務器沒啟動,報Connection refused異常
2 socket.getInputStream() 讀取服務器端返回的流
3 socket.getOutputStream() 獲取輸出流,寫入數據發送到服務器端
在NIO模式下Server端:
1 ServerSocketChannel.open() 獲取serverScoketChannel實例
2 serverScoketChannel.configueBlocking(false) 設置channel為非阻塞模式
3 serverSocketChannel.socket() 獲取serverSocket對象
4 serverSocket.bind(port) 監聽端口
5 Selector.open() 打開Selector,獲取selector實例
6 serverSocketChannel.register(Selector,int) 向selector注冊channel和感興趣的事件
7 while(true) 循環以保證正常情況下服務器端一直處于運行狀態
8 selector.select() 獲取selector實例中需要處理的SelectionKey的數量
9 for(SelectionKey key:selector.selectedKeys()) 遍歷selector.selectedKeys,以對每個SelectionKey的事件進行處理
10 key.isAcceptable() 判斷SelectionKey的類型是否為客戶端建立連接的類型
11 key.channel() 當SelectionKey的類型是acceptabel時,獲取綁定的ServerSocketChannel對象
12 serverSocketChannel.accept() 接受客戶端建立連接的請求,并返回SocketChannel對象
13 socketChannel.regiseter(Selector,int) 向Selector注冊感興趣的事件類型,如read,write
14 key.isReadable() 判斷SelectionKey是否為readable,如是則意味著有消息流在等待處理
15 socketChannel.read(ByteBuffer) 從SelectionKey中綁定的SocketChannel對象讀取消息流
16 socketChannel.write(ByteBuffer) 從SelectionKey中綁定的SocketChannel對象輸出消息流
jdk1.6及之前都只實現BIO 和 NIO
jdk1.7開始支持AIO,即NIO 2.0
在BIO阻塞模式下server端:
1 new ServerSocket(int port) 監聽端口
2 serverSocket.accept() 阻塞式等待客戶端的連接,有連接才返回Socket對象
3 socket.getINputStream() 獲取客戶端發過來的信息流
4 socket.getOutputStream() 獲取輸出流對象,從而寫入數據返回客戶端
client端:
1 newSocket(String host,int port) 建立與服務器端的連接,如果服務器沒啟動,報Connection refused異常
2 socket.getInputStream() 讀取服務器端返回的流
3 socket.getOutputStream() 獲取輸出流,寫入數據發送到服務器端
在NIO模式下Server端:
1 ServerSocketChannel.open() 獲取serverScoketChannel實例
2 serverScoketChannel.configueBlocking(false) 設置channel為非阻塞模式
3 serverSocketChannel.socket() 獲取serverSocket對象
4 serverSocket.bind(port) 監聽端口
5 Selector.open() 打開Selector,獲取selector實例
6 serverSocketChannel.register(Selector,int) 向selector注冊channel和感興趣的事件
7 while(true) 循環以保證正常情況下服務器端一直處于運行狀態
8 selector.select() 獲取selector實例中需要處理的SelectionKey的數量
9 for(SelectionKey key:selector.selectedKeys()) 遍歷selector.selectedKeys,以對每個SelectionKey的事件進行處理
10 key.isAcceptable() 判斷SelectionKey的類型是否為客戶端建立連接的類型
11 key.channel() 當SelectionKey的類型是acceptabel時,獲取綁定的ServerSocketChannel對象
12 serverSocketChannel.accept() 接受客戶端建立連接的請求,并返回SocketChannel對象
13 socketChannel.regiseter(Selector,int) 向Selector注冊感興趣的事件類型,如read,write
14 key.isReadable() 判斷SelectionKey是否為readable,如是則意味著有消息流在等待處理
15 socketChannel.read(ByteBuffer) 從SelectionKey中綁定的SocketChannel對象讀取消息流
16 socketChannel.write(ByteBuffer) 從SelectionKey中綁定的SocketChannel對象輸出消息流
client端:
1 SocketChannel.open() 打開SocketChannel
2 SocketChannel.configureBlocking(false) 將SocketChannel配置為非阻塞模式
3 SocketChannel.connect(host,port) 連接到指定的目標地址
4 Selector.open() 打開Selector
5 SocketChannel.register(Selector,int) 向Selector注冊感興趣的事件,connected,read,write
6 while(true) 循環執行保證客戶端一直處于運行狀態
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中讀取數到ByteBuffer中
15 SocketChannel.write(ByteBuffer) 向SocketChannel中寫入ByteBuffer對象數據