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 и да оставите двигателя да ви каже какво да правите по-нататък. Трябва да блокирате или деактивирате използването на този двигател от други нишки, докато задачата не завърши, т.е. не избирайте този канал.

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

Това щях да съм аз. Мразя тези опашки. Просто събуждам() селектора и променям interestOps, никога не съм виждал проблем с това. Селекторната нишка трябва да се справи правилно с готовите нулеви ключове, но вече трябва да направи това.

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 Зависи изцяло от това как е организирана останалата част от кода ви. Имам SSLSelector, така че мога да го събудя от нишката на задачата и да възстановя interestOps на ключа на канала, което в крайна сметка ще доведе до задействане на OP_READ или OP_WRITE, което ще накара приложението да повтори оригиналната операция. Вашият пробег ще варира :-) - person user207421; 30.12.2012
comment
@PeterPenzov Трябва да има такъв в Apache Tomcat NIO Connector, а може да има и в 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