我正在構建一個小型客戶端/服務器聊天應用程序。我NIO.2在嘗試使用經典NIO庫模擬它后遇到了它。我使用 classisc NIO 對 NIO.2 庫進行“模擬”的目標是在通過 a 成對連接的多個線程中使用多個選擇器ArrayBlockingQueue,以避免網絡讀寫時間。我的問題是,如何在 NIO.2 庫中使用AsynchronousSocketChannels和CompletionHandlers(根據我的理解作為回調)同時處理多個事件?經典的NIOlib 使用Selectorswhich 在select調用 a后交付key set。這key set然后可以遍歷每個事件(閱讀,接受并寫入)可以處理一個又一個。在NIO.2另一方面回調,沒有這樣的序列。它們是異步的。那么,例如,如果 2 個客戶端在同一時刻向服務器發送消息,會發生什么?那么 2 個回調是否同時運行?如果是,那么如何?它們是否都在單獨的線程中運行?如果我要從每個回調中獲取這些消息并嘗試將它們排入隊列,如前所述ArrayBlockingQueue,它們會相互等待嗎?
1 回答

慕的地6264312
TA貢獻1817條經驗 獲得超6個贊
那么,例如,如果 2 個客戶端在同一時刻向服務器發送消息,會發生什么?
客戶端不與服務器共享公共連接。在服務器端,您會AsynchronousSocketChannel#read
為兩個客戶端調用回調,當一些字節到達時會觸發。
出于這個原因,兩個回調可以同時運行(因為它們是異步的),但它們對于每個客戶端仍然是獨立的,所以不會有問題。
它們是否都在單獨的線程中運行?
這取決于 backingAsynchronousChannelGroup
的線程池(您可以自己指定或使用默認組)。
我用 NIO.2 創建了一個簡單的網絡庫,我認為它會幫助你:https : //github.com/jhg023/SimpleNet
添加回答
舉報
0/150
提交
取消