7

Java NIO を使用してサーバーを作成していますが、答えが見つからない質問がいくつかあります。

まず、SSLEngine についてNEED_TASKですが、セパレートスレッドで適切に扱うにはどうすればよいでしょうか。別のスレッドでタスクを呼び出すと、タスクは完了しますが、別のハンドシェイク操作を実行するために戻る方法がわかりません。1 つのオプションは、委任されたタスクを実行していたスレッドからその操作を呼び出すことですが、それはそれを行う方法ではないと思います。

別の質問はinterestOps()、別のスレッドからの呼び出しと、セレクタ スレッドからの呼び出しに関するものです。チャネルへの書き込みを試みてもすべてのデータが書き込まれなかったので、重要な関心事項を変更する必要があります。ROX NIOチュートリアルのような変更のキューを使用することを考えましたが、ここの別のスレッドでそれが最善の方法ではないことを読みました.

4

1 に答える 1

3

まずSSLEngineについて、別スレッドでNEED_TASKを適切に扱う方法。別のスレッドでタスクを呼び出すと、タスクは完了しますが、別のハンドシェイク操作を実行するために戻る方法がわかりません。

エンジンが NEED_TASK 状態にある間は、他に何もできません。タスクが完了したら、最初に NEED_TASK を返した操作を繰り返して、次に何をすべきかをエンジンに指示させる必要があります。タスクが完了するまで、他のスレッドによるそのエンジンの使用をブロックまたは無効にする必要があります。つまり、そのチャネルを選択しないでください。

もう 1 つの質問は、別のスレッドから、次にセレクター スレッドから interestOps() を呼び出すことです。チャネルへの書き込みを試みてもすべてのデータが書き込まれなかったので、重要な関心事項を変更する必要があります。ROX NIOチュートリアルのように、ある種の変更キューを使用することを考えましたが、ここの別のスレッドでそれが最善の方法ではないことを読みました.

それは私だったでしょう。私はそれらのキューが嫌いです。セレクターを wakeup() し、interestOps を変更するだけで、問題は見られませんでした。セレクター スレッドは、準備が整ったゼロ キーに正しく対処する必要がありますが、既にそれを行う必要があります。

于 2012-12-30T19:00:22.067 に答える