2012-12-30 14 views
6

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

最初に、SSLEngineに関して、NEED_TASKをどのように分離されたスレッドで適切に処理するのですか?別のスレッドでタスクを呼び出すと、それらは完了しますが、別のハンドシェイク操作を実行するために戻っていく方法はわかりません。 1つのオプションは、委任されたタスクを実行していたスレッドからその操作を呼び出すことですが、それはそれを行う方法ではないと思います。

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

+1

閉鎖投票者:あなたが個人的にそれを理解していなくても、本当に本当の質問です。 – EJP

答えて

3

最初にSSLEngineに関して、別のスレッドでNEED_TASKを正しく処理する方法。別のスレッドでタスクを呼び出すと完了しますが、別のハンドシェイク操作を実行するにはどのように戻って行くのか分かりません。

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

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

それは私でした。私はそれらの待ち行列が嫌いです。私はセレクタを起動してinterestOpsを変更するだけで、問題は見られませんでした。セレクタスレッドは、準備が整っているゼロキーに正しく対応する必要がありますが、すでにそれを行う必要があります。

+0

私はこのソリューションにも興味があります。どの実例? –

+0

私はこれらの2つのソリューションのどれが参照されているのかよくわかりませんが、SSLEngineを内部的に使用し、SelectorProviderとしてパッケージ化されたSSLSocketChannel/SSLSelector/SSLServerSocketChannel製品の完全な市販の実装があります。リクエストの詳細。 – EJP

+0

2番目の答えは明確で、それが私がやることです。最初に私はまだ疑問を持っています。私は明確なNEED_TASKを呼び出した最後の操作を再開する必要がありますが、私はそれを行う方法がわかりません。私が考えることができるのは、タスクを完了したスレッドから再開することです。セレクタスレッド。私はおそらく進歩するためのヒントを教えてください。 – user1418979

関連する問題