Java NIO и SSL

Я пишу сервер, используя java NIO, и у меня есть несколько вопросов, на которые я не могу найти ответы.

Во-первых, что касается SSLEngine, как правильно обрабатывать NEED_TASK в отдельном потоке? Когда я вызываю задачи в отдельном потоке, они завершаются, но я понятия не имею, как вернуться назад, чтобы выполнить другую операцию рукопожатия. Одним из вариантов было бы вызвать эту операцию из потока, выполняющего делегированную задачу, но я думаю, что это не так.

Другой вопрос касается вызова interestOps() из другого потока, а не потока селектора. Мне нужно изменить ключевые интересы после того, как попытка записи в канал не записала все данные. Я думал об использовании какой-то очереди изменений, как в учебнике ROX NIO, но я прочитал в другой ветке здесь, что это не лучший способ.


person user1418979    schedule 30.12.2012    source источник
comment
Близкому избирателю: это действительно реальный вопрос, даже если вы лично его не понимаете.   -  person user207421    schedule 30.12.2012


Ответы (1)


сначала о SSLEngine, как правильно обрабатывать NEED_TASK в отдельном потоке. Когда я вызываю задачи в отдельном потоке, они завершаются, но я понятия не имею, как вернуться, чтобы выполнить другие операции рукопожатия.

Пока движок находится в состоянии NEED_TASK, он больше ничего делать не может. Когда задача завершится, вы должны повторить операцию, которая первоначально вернула NEED_TASK, и позволить движку сказать вам, что делать дальше. Вам необходимо заблокировать или отключить использование этого движка другими потоками до тех пор, пока задача не будет завершена, то есть не выбирайте этот канал.

Другой вопрос касается вызова интересаOps() из другого потока, а не потока селектора. Мне нужно изменить ключевые интересы после того, как попытка записи в канал не записала все данные. Я думал об использовании какой-то очереди изменений, как в учебнике ROX NIO, но я прочитал в другой ветке здесь, что это не лучший способ.

Это был бы я. Я ненавижу эти очереди. Я просто пробуждаю() селектор и меняю интересОпс, никогда не видел с этим проблем. Поток селектора должен правильно справляться с нулевыми готовыми ключами, но он уже должен это сделать.

person user207421    schedule 30.12.2012
comment
Я не уверен, на какое из этих двух решений вы ссылаетесь, но у меня есть полная коммерчески доступная реализация продукта SSLSocketChannel/SSLSelector/SSLServerSocketChannel, который использует SSLEngine внутри и упакован как SelectorProvider. Подробности по запросу. - person user207421; 30.12.2012
comment
Второй ответ ясен, и это то, что я собираюсь сделать. Насчет первого у меня все еще есть некоторые сомнения. Я должен возобновить последнюю операцию, которая вызвала NEED_TASK, это ясно, но я понятия не имею, как это сделать, единственное, что я могу придумать, это возобновить ее из потока, который завершил задачу, но это переместит выполнение чтения/записи из селекторная нить. Не могли бы вы дать мне, возможно, подсказку, как действовать - person user1418979; 30.12.2012
comment
Я ищу реализацию GPL для Java SSLengine + NIO. Вы знаете, где я могу найти бесплатный пример кода? - person Peter Penzov; 30.12.2012
comment
@user1418979 user1418979 Это полностью зависит от того, как организована остальная часть вашего кода. У меня есть SSLSelector, поэтому я могу разбудить его из потока задач и восстановить интересOps ключа канала, что в конечном итоге вызовет срабатывание OP_READ или OP_WRITE, что заставит приложение повторить исходную операцию. Ваш пробег будет варьироваться :-) - person user207421; 30.12.2012
comment
@PeterPenzov Должен быть один в коннекторе Apache Tomcat NIO, и он может быть и в Netty. Однако весь код SSLEngine, который я когда-либо видел, кроме моего :-), не может правильно обрабатывать повторные рукопожатия. - person user207421; 30.12.2012
comment
Хорошо, спасибо за помощь, я собираюсь попробовать что-то подобное с обычным селектором. Я отмечаю ваш ответ как правильный, еще раз спасибо - person user1418979; 30.12.2012
comment
@PeterPenzov Производительность этих вещей определяется криптографическим кодом и сетью, а не тем, что вы делаете вокруг этого, за исключением, я думаю, в случае серьезной некомпетентности. - person user207421; 30.12.2012
comment
Для тех, кто заинтересован, я написал кое-что, чтобы сделать использование SSLEngine немного проще. Его можно использовать с NIO или для других вариантов использования. Доступно здесь SSLFacade - person keios; 25.06.2013