我們知道nio是同步非阻塞,伺服器實現模式為乙個請求乙個執行緒,即客戶端傳送的連線請求都會註冊到多路復用器上,多路復用器輪詢到連線有i/o請求時才啟動乙個執行緒進行處理。
而aio則是則是非同步非阻塞的,並且提供了非同步檔案通道和非同步套接字通道的實現。主要通過兩種方式獲取操作的結果:
public class timeserver catch (numberformatexception e)
}asynctimeserverhandler timeserverhandler = new asynctimeserverhandler(port);
new thread(timeserverhandler,"aio-asynctimeserverhandler-001").start();
}}
首先建立非同步的時間服務處理器,然後啟動執行緒將非同步時間服務handler拉起
public class asynctimeserverhandler implements runnablecatch (ioexception e)
}public void run() catch (interruptedexception e)
}public void doaccept()
}
在構造方法中,我們建立了乙個一步的channel,然後呼叫bind方法繫結了監聽的埠。
在run方法中我們初始化了乙個countdownlatch物件,是為了在完成一組正在執行的操作之前,執行緒一直阻塞在那兒
在doaccept方法中接收客戶端的連線,我們可以傳遞乙個handler示例接受accept操作成功的通知訊息,其**如下:
public class acceptcompletionhandler implements completionhandler
@override
public void failed(throwable exc, asynctimeserverhandler attachment)
}
其中,我們在complete方法中繼續呼叫了accept方法,是為了有新的客戶端接入成功,因為乙個asynchronousserversocketchannel可以接受成千上萬個客戶端
而鏈路建立成功以後,服務端可以接受客戶端的請求訊息了,通過read方法進行非同步讀操作,其中傳入了乙個handler,接受通知**業務。其**如下
public class readcompltetionhandler implements completionhandler
@override
public void completed(integer result, bytebuffer attachment) catch (unsupportedencodingexception e)
}private void dowrite(string currenttime)
}@override
public void failed(throwable exc, bytebuffer attachment) catch (ioexception e)
}});}}
@override
public void failed(throwable exc, bytebuffer attachment) catch (ioexception e)
}}
其中具體的處理邏輯和nio的timeserver相同,不做詳細分析了
public class timeclient catch (numberformatexception e)
}asynctimeclienthandler timeclienthandler = new asynctimeclienthandler("127.0.0.1",port);
new thread(timeclienthandler,"aio-asynctimeclienthandler-001").start();
}}
在其中我們通過乙個i/o執行緒建立一步時間伺服器客戶端handler,具體**如下:
public class asynctimeclienthandler implements completionhandler,runnable catch (ioexception e)
}@override
public void completed(void result, asynctimeclienthandler attachment) else catch (unsupportedencodingexception e)
}@override
public void failed(throwable exc, bytebuffer attachment) catch (ioexception e)
}});}}
@override
public void failed(throwable exc, bytebuffer attachment) catch (ioexception e)
}});
}@override
public void failed(throwable exc, asynctimeclienthandler attachment) catch (ioexception e)
}@override
public void run() catch (interruptedexception e)
try catch (ioexception e)
}}
BIO NIO和AIO的區別
在io讀寫時,把 io請求 與 讀寫操作 分離調配進行,需要用到事件分離器。根據處理機制的不同,事件分離器又分為 同步的reactor和非同步的proactor。reactor模型 proactor模型 同步和非同步的區別就在於 讀 操作由誰完成 同步的reactor是指程式發出讀請求後,由分離器監...
使用AIO軟體清除日誌
simeon原創 本章介紹的內容只是為了讓讀者了解黑客攻擊的一般原理和方法,從而加強網路安全的意識,並非讓讀者真正的成為危害網路及社會的黑客。由於讀者利用本章介紹的某些方法和工具對網路或別人的系統造成了危害或嚴重後果,作者不負任何責任。由此帶來的一切法律後果由使用者自負 通過本案例可以學習到 1 了...
BIO NIO和AIO的區別
一 事件分離器 在io讀寫時,把 io請求 與 讀寫操作 分離調配進行,需要用到事件分離器。根據處理機制的不同,事件分離器又分為 同步的reactor和非同步的proactor。reactor模型 proactor模型 同步和非同步的區別就在於 讀 操作由誰完成 同步的reactor是指程式發出讀請...