posts - 12, comments - 0, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          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對象輸出消息流

          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對象數據
          主站蜘蛛池模板: 金川县| 同江市| 太仆寺旗| 黄冈市| 分宜县| 长海县| 开平市| 武安市| 桐庐县| 修文县| 施甸县| 南川市| 乌苏市| 民乐县| 班戈县| 芦山县| 宁德市| 衢州市| 河曲县| 新巴尔虎右旗| 阿图什市| 介休市| 永福县| 阳信县| 清水河县| 宜宾市| 金坛市| 雷波县| 五常市| 乐昌市| 富裕县| 兰考县| 哈密市| 宿迁市| 高唐县| 新密市| 凌云县| 陆河县| 田东县| 阿拉尔市| 关岭|