NIO客户端主要创建过程
生活随笔
收集整理的這篇文章主要介紹了
NIO客户端主要创建过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
NIO客戶端主要創建過程: ? 步驟一:打開SocketChannel,綁定客戶端本地地址(可選,默認系統會隨機分配一個可用的本地地址),示例代碼如下:? SocketChannel clientChannel = SocketChannel.open();? 步驟二:設置SocketChannel為非阻塞模式,同時設置客戶端連接的TCP參數,示例代碼如下: ClientChannel.configureBlocking(false);
socket.setReuseAddress(true);
socket.setReceiveBufferSize(BUFFER_SIZE);
socket.setSendBufferSize(BUFFER_SIZE); 步驟三:異步連接服務端,示例代碼如下: boolean connected = clientChannel.connect(new InetSocketAddress(IP,port)); 步驟四:判斷是否連接成功,如果連接成功,則直接注冊讀狀態為到多路復用器中,如果當前沒有連接成功(異步連接,返回false,說明客戶端已經發送sync包,服務端沒有返回ack包,物理鏈路還沒有建立),示例代碼如下: if(connected){clientChannel.register(seletor,SelectionKey.OP_READ,ioHandler);
}else{clientChannel.register(selector,Selection.OP_CONNECT,ioHandler);
}
步驟五:向Reactor線程的多路復用器注冊OP_CONNET狀態位,監聽服務端的TCP ACK應答,示例代碼如下:
clientChannel.register(select, SelectionKey.OP_CONNECT,ioHandler); 步驟六:創建Reactor線程,創建多路復用器并啟動線程,示例代碼如下: Selector selector = Selector.open(); New Thread(new ReactorTask()).start();步驟七:多路復用器在線程run方法的無限循環體內輪詢準備就緒的Key,示例代碼如下:?
int num = selector.select(); Set selectedKeys = selector.selectedKeys(); Iterator it = selectedKeys.iterator(); while(it.hasNext){SelectionKey key = (SelectionKey)it.next();//...deal with I/O event ... } 步驟八:接收connect事件進行處理,示例代碼如下: if(key.isConnectable()){//handlerConnect(); }步驟九:判斷連接成功,如果連接成功,注冊讀事件到多路復用器,示例代碼如下:?
if(channel.finishConnect()){registerRead(); } 步驟十:注冊讀事件到多路復用器,示例代碼如下: clientChannel.register(selector,SelectionKey.OP_READ,ioHandler);步驟十一:異步讀客戶端請求消息到緩沖區,示例代碼如下:?
int readNumber = channel.read(receivedBuffer);步驟十二:對ByteBuffer進行編解碼,如果有半包消息接收緩沖區Reset,繼續讀取后續的報文,將解碼成功的消息封裝成Task,投遞到業務線程池中,進行業務邏輯編排,示例代碼如下:?
Object message = null; whiel(buffer.hasRemain()){byteBuffer.mark();Object message = decode(byteBuffer);if(message == null){byteBuffer.reset();break;}messageList.add(message); } if( !byteBuffer.hasRemain()){byteBuffer.clear(); }else{byteBuffer.compact(); } if(messageList != null & !messageList.isEmpty()){for(Object messageE : messageList){handlerTask(messageE);} }步驟十三:將POJO對象encode成ByteBuffer,調用SocketChannel的異步write接口,將消息異步發送給客戶端。示例代碼如下:?
socketChannel.write(buffer);轉載于:https://www.cnblogs.com/wmcoder/p/7169550.html
總結
以上是生活随笔為你收集整理的NIO客户端主要创建过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle查询包含某个字段的表
- 下一篇: 20162314 《Program De