2012-12-30 51 views
6

我正在寫一個服務器使用Java的NIO,我有幾個問題,我無法找到答案。Java的NIO和SSL

一,關於SSLEngine,如何在分離線程中正確處理NEED_TASK?當我在單獨的線程中調用任務時,他們完成了,但我不知道如何返回來執行另一個握手操作。一種選擇是從正在執行委託任務的線程調用該操作,但我想這不是做到這一點的方法。

另一個問題是關於從不同的線程調用interestOps()然後選擇線程。在嘗試寫入頻道之後,我不得不寫入所有數據,以改變關鍵興趣。 我想過使用某種類似於ROX NIO教程中的變化隊列,但是我在另一個線程中看過這不是最好的方法。

+1

緻密選民:這確實是一個真正的問題,即使你個人不理解它。 – EJP

回答

3

首先關於SSLEngine,如何在分離線程中正確處理NEED_TASK。當我在單獨的線程中調用任務時,他們完成了,但我不知道如何返回來執行另一個握手操作。

雖然引擎處於NEED_TASK狀態,但它不能做任何事情。當任務完成後,您應該重複最初返回NEED_TASK的操作,並讓引擎告訴您下一步該做什麼。您需要阻止或禁止其他線程使用該引擎,直到任務完成,即不要選擇該通道。

另一個問題是關於從不同線程調用interestOps()然後選擇線程。在嘗試寫入頻道之後,我不得不寫入所有數據,以改變關鍵興趣。我考慮過在ROX NIO教程中使用某種類型的更改隊列,但是我在另一個線程中看過,它不是最好的方法。

那就是我。我討厭那些隊列。我只是喚醒()選擇器,並改變interestOps,從來沒有看到這個問題。選擇器線程必須正確處理準備好的零鍵,但它已經需要這樣做。

+0

我對這個解決方案也很感興趣。任何工作的例子? –

+0

我不確定您引用了這兩種解決方案中的哪一種,但是我有一個完整的商業可用實現,它在內部使用SSLEngine並打包爲SelectorProvider,該實現的SSLSocketChannel/SSLSelector/SSLServerSocketChannel產品。詳情請求。 – EJP

+0

第二個答案很明確,那就是我要做的。關於第一我還有一些疑問。我必須恢復最後一個調用NEED_TASK的操作,但是我不知道該怎麼做,我能想到的唯一辦法是從線程恢復完成的任務,但這會將讀/寫的執行從選擇器線程。你可以給我一些提示如何繼續 – user1418979