{"id":188088,"date":"2013-07-28T15:44:03","date_gmt":"2013-07-28T11:44:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=188088"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=188088","title":{"rendered":"<span class=\"post_title\">\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e java-\u043a\u043e\u0434\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/span>"},"content":{"rendered":"<div class=\"content html_format\">\n<h4> Disclaimer<\/h4>\n<p>  \u0412\u0441\u0435, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0438 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0437\u0432\u0430\u043d\u0438\u0435 \u00ab\u0438\u0441\u0442\u0438\u043d\u044b \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u00bb.<\/p>\n<h4> \u041f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u0430<\/h4>\n<p>  \u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435. \u042f \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0438\u0433\u0440. \u041c\u043e\u0438\u043c \u043b\u044e\u0431\u0438\u043c\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u0433\u0440\u044b. <br \/>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0434\u0435\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Apache Tomcat. \u041e\u043d \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u043e http \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443. \u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438\u0433\u0440\u044b \u0441\u0445\u0435\u043c\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f, \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<br \/>  \u041d\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0435\u0436\u0434\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439(\u0434\u0430, \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u0442\u0443\u0442 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0435\u0431\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c) \u0441\u0442\u0430\u043b\u0430 \u0438\u0434\u0435\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c, \u0442.\u043a. \u0432 \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435\\\u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u043e\u0441\u044c WebSocket API \u0434\u043b\u044f Tomcat, \u043d\u043e \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. <a name=\"habracut\"><\/a><\/p>\n<h4>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h4>\n<p>  \u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0438\u0434\u0435\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c:  <\/p>\n<ul>\n<li> NetBeans 7.2.1: \u0432 \u043d\u0435\u0439, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432\u0435\u0441\u044c java-\u043a\u043e\u0434 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438<\/li>\n<li>JDK 1.7<\/li>\n<li>Netty: \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c nio, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u044b\u043b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0448\u0435\u043b. <\/li>\n<li> Socket IO: \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/li>\n<li> Apache Tomcat 7.0.27: \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432<\/li>\n<li> Maven: \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0440\u0430<\/li>\n<\/ul>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h4>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/aa8\/33d\/a84\/aa833da84852ee97a3bfbffc795a5ae4.png\"\/><br \/>  <b>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/b><\/p>\n<p>  \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c <i>SocketServletContainer<\/i>. \u041e\u043d \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\/\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430\u043c\u0438. \u0425\u043e\u0447\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0442\u0435\u0440\u043c\u0438\u043d \u0441\u0435\u0440\u0432\u043b\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u043c\u0435\u0442\u043e\u0434 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 Servlet \u043e\u0442 JCP. \u041f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430\u043c\u0438.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u044b \u0438\u043c\u0435\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <i>Servlet<\/i>, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f(<i>SocketSession<\/i>), \u0441\u043b\u0443\u0436\u0430\u0449\u0438\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e(\u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a, \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u043f\u043e\u0437\u0436\u0435). \u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430(<i>InputBuffer <\/i>\u0438 <i>OutputBuffer<\/i>) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <i>Config<\/i>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0444\u0430\u0439\u043b\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 xml. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u0438 \u043e \u043a\u043b\u0430\u0441\u0441\u0430\u0445 <i>QueueHandler <\/i>\u0438 <i>TaskHandler<\/i>.<\/p>\n<p>  <i>QueueHandler <\/i>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <i>Task <\/i>\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<br \/>  <i>TaskHandler <\/i>\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <i>Runnable<\/i>. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 run \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<br \/>  \u041a\u043b\u0430\u0441\u0441 <i>Task <\/i>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435(\u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440) \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0442\u044c\u044e(read\\write).<\/p>\n<p>  <b>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0442\u044c\u044e:<\/b><\/p>\n<p>  \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Netty, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043e \u043c\u0435\u043d\u044f( \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0445\u0430\u0431\u0440\u0430\u044e\u0437\u0435\u0440\u0443 <a href=\"http:\/\/habrahabr.ru\/users\/rena4ka\/\" class=\"user_link\">Rena4ka<\/a> \u0437\u0430 \u0435\u0435 \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e Netty). \u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435, \u043a\u0430\u043a \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0443 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c \u043e\u043f\u044b\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Netty.<br \/>  \u041a\u043b\u0430\u0441\u0441 <i>ServerPipelineFactory <\/i>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439 ChannelPipeline \u0438 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Netty. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c 3 \u043a\u043b\u0430\u0441\u0441\u0430: <i>Decoder<\/i>, <i>Encoder<\/i>, <i>NioHandler<\/i>.<br \/>  \u041f\u0435\u0440\u0432\u044b\u0435 2- \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u0435\u043a\u043e\u0434\u0435\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0430\u043a\u0435\u0442\u0430, \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0435\u0433\u043e \u0438\u0437 \u0441\u0435\u0442\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <i>Task<\/i>. Encoder \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 <i>Task <\/i>\u0432 \u0441\u0435\u0442\u044c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442.<br \/>  <i>NioHandler<\/i>, \u043f\u043e \u0441\u0443\u0442\u0438, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438.<\/p>\n<h4>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/h4>\n<p>  \u0414\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0443\u0436\u0435\u043d \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u042f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c.<br \/>  \u0412 \u0438\u0442\u043e\u0433\u0435, \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0438\u043c\u0435\u044e\u0449\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434: \u0438\u043c\u044f_\u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430[sysDiv]\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b_\u0437\u0430\u043f\u0440\u043e\u0441\u0430.<br \/>  \u0424\u043e\u0440\u043c\u0430\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430: name1=value1, name2=value2,\u2026<\/p>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0440<\/b>: \u00abTS[sysDiv]message=Hello habrahabr.ru\u00bb.<\/p>\n<p>  \u041d\u0443\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u043c \u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442, \u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u043a\u043e\u0434\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041d\u043e \u043e\u0431\u043e \u0432\u0441\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<h4>\u0424\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430<\/h4>\n<p>  <\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;config&gt;   &lt;address&gt;localhost&lt;\/address&gt;   &lt;port&gt;9999&lt;\/port&gt;   &lt;workThreadCount&gt;2&lt;\/workThreadCount&gt;   &lt;processThreadCount&gt;2&lt;\/processThreadCount&gt; &lt;\/config&gt; <\/code><\/pre>\n<p>  <b>workThreadCount<\/b> \u2014 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0435\u0442\u0438 \u0438 \u043f\u0438\u0448\u0443\u0442 \u0432 \u0441\u0435\u0442\u044c(\u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Netty).<br \/>  <b>processThreadCount<\/b> \u2014 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u0431\u0449\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0412 \u043d\u0438\u0445, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0440\u043e\u043a-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430 \u0432\u0441\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u043e\u0432.<\/p>\n<h4>SocketServletContainer<\/h4>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c\u00bb \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0438 \u0442\u0430\u043a \u043a \u043d\u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0418, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f 1 \u043a\u043e\u043f\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435(\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430). \u0427\u0442\u043e, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u043b\u043e\u0433\u0438\u0447\u043d\u043e.  <\/p>\n<pre><code class=\"java\">public class SocketServletContainer {     private Channel channel;     private ServerBootstrap networkServer;     private QueueHandler queueHander;     private Map&lt;String, Servlet&gt; servlets;         private Config conf;     private static SocketServletContainer server= null;      private static List&lt;SocketSession&gt; list= new ArrayList&lt;SocketSession&gt;();          public List&lt;SocketSession&gt; getListSession()     {         return list;     }          static public SocketServletContainer getInstance()     {         if (server==null)         {             server= new SocketServletContainer();         }                  return server;     }          private SocketServletContainer()     {         conf= new Config(&quot;conf.xml&quot;);        \/\/\u041f\u0430\u0440\u0441\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438- \u043a\u0438\u0434\u0430\u0435\u043c Exception.         try         {             conf.read();         }         catch(Exception e)         {             throw new ContainerInitializeException(e.toString());         }                  servlets= new HashMap&lt;String, Servlet&gt;();     }          public void start()     {         \/\/\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c Netty         ExecutorService bossExec = new OrderedMemoryAwareThreadPoolExecutor(1, 400000000, 2000000000, 60, TimeUnit.SECONDS);         ExecutorService ioExec = new OrderedMemoryAwareThreadPoolExecutor(conf.getWorkThreadCount(), 400000000,                 2000000000, 60, TimeUnit.SECONDS);         networkServer = new ServerBootstrap(new NioServerSocketChannelFactory(bossExec, ioExec,  conf.getWorkThreadCount()));         networkServer.setOption(&quot;backlog&quot;, 500);         networkServer.setOption(&quot;connectTimeoutMillis&quot;, 10000);         networkServer.setPipelineFactory(new ServerPipelineFactory());         channel = networkServer.bind(new InetSocketAddress(conf.getAddress(), conf.getPort()));         \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432         queueHander= new QueueHandler(conf.getProcessThreadCount());                  System.out.println(&quot;Ready&quot;);     }     \/\/\u041c\u0435\u0442\u043e\u0434 \u00ab\u0433\u0440\u0443\u0431\u043e\u0439\u00bb \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430     public void stop()     {         if (channel.isOpen())         {             ChannelFuture future= channel.close();             future.awaitUninterruptibly();         }                     queueHander.stop();     }          public QueueHandler getQueueHandler()     {         return this.queueHander;     }     \/\/\u041c\u0435\u0442\u043e\u0434 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435     public void registerServlet(Servlet servlet, String name)     {         \/\/\u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u043b\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d- \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 HashMap.         synchronized(servlets)         {             if (!servlets.containsKey(name))             {                 servlets.put(name, servlet);             }         }       }          public Servlet getServlet(String name)     {         return servlets.get(name);     } } <\/code><\/pre>\n<p>  <\/p>\n<h4>Servlet<\/h4>\n<p>  \u0422\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u041c\u0435\u0442\u043e\u0434 doRequest \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u0430\u043a\u0435\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u043b\u0435\u0442.<br \/>  <i>\u0417\u0430\u043c<\/i>: \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434 doRequest \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441 \u0442\u043e\u0439 \u0446\u0435\u043b\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u043b\u0435\u0442 \u043c\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c List \u0432\u0441\u0435\u0445 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0440\u0430\u0437\u043e\u0441\u043b\u0430\u0442\u044c \u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0430\u0442\u0430.  <\/p>\n<pre><code class=\"java\">abstract public class Servlet {     abstract public void doRequest(InputBuffer input, OutputBuffer output, SocketSession session); } <\/code><\/pre>\n<p>  <\/p>\n<h4>SocketSession<\/h4>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 id. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0443\u043b id-\u043d\u0438\u043a\u043e\u0432 \u043d\u0430 20000 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043b\u0438\u043c\u0438\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e, \u0431\u0443\u0434\u0435\u0442 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b.<br \/>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0443\u043b\u0430 \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c, \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435.  <\/p>\n<pre><code class=\"java\">public class SocketSession {         private static byte[] idPool;          public int generateId()     {         synchronized(idPool)         {             if (idPool==null)             {                 idPool= new byte[20000];                 for (int j=0;j&lt;idPool.length;j++)                 {                     idPool[j]=0;                 }             }             for (int j=0;j&lt;idPool.length;j++)             {                 if (idPool[j]==0)                 {                     idPool[j]=1;                     return j;                 }             }             return -1;         }     }          private int id;     private Channel channel;      \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0435\u0441\u0441\u0438\u044e \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0435 \u0432 List \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f.     public SocketSession(Channel channel)     {         this.channel= channel;         this.id= generateId();         \/\/\u0435\u0441\u043b\u0438 \u043c\u0435\u0441\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442         if (this.id==-1)         {             OutputBuffer out= new OutputBuffer();             out.setPar(&quot;error&quot;, &quot;Connection limit error&quot;);             send(out, &quot;System Servlet&quot;);             \/\/\u0417\u0430\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443             System.err.println(&quot;Connection limit error&quot;);             return;         }                  SocketServletContainer.getInstance().getListSession().add(this);     }          public int getId()     {         return id;     }     \/\/\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0443. \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u043d\u0435\u0441\u0435\u043d \u0432 \u043a\u043b\u0430\u0441\u0441 \u0421\u0435\u0441\u0441\u0438\u0438 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.     public void send(OutputBuffer output, String servletName)     {                  synchronized(channel)         {             channel.write(new Task(servletName, output.toString()));         }     }     \/\/\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043e\u0431\u0440\u044b\u0432\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u00ab\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u043c\u00bb \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0435     public void close()     {         synchronized(idPool)         {             idPool[this.id]= 0;         }         channel.close();         SocketServletContainer.getInstance().getListSession().remove(this);     } } <\/code><\/pre>\n<p>  <\/p>\n<h4>InputBuffer<\/h4>\n<p>  \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0441\u0442\u0440\u043e\u043a\u0430 source \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.  <\/p>\n<pre><code class=\"java\">public class InputBuffer {          private Map&lt;String, String&gt; map= new HashMap&lt;String, String&gt;();          public InputBuffer(String source)     {         String[] par= source.split(&quot;,&quot;);         for (int j=0; j&lt; par.length; j++)         {             if (!par[j].contains(&quot;=&quot;))             {                 continue;             }             String[] data= par[j].split(&quot;=&quot;);             if (data.length&lt;2)             {                 System.err.println(&quot;Parsing Error&quot;);                 continue;             }             map.put(data[0], data[1]);         }     }          public String getPar(String key)     {         return map.get(key);     } } <\/code><\/pre>\n<p>  <\/p>\n<h4>OutputBuffer<\/h4>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u0435\u043d. \u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435- \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 toString(), \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <i>SocketSession<\/i>.  <\/p>\n<pre><code class=\"java\">public class OutputBuffer {          private List&lt;String&gt; list= new ArrayList&lt;String&gt;();          public void setPar(String key, String par)     {         list.add(key+&quot;=&quot;+par);     }          @Override     public String toString()     {         StringBuilder res= new StringBuilder();                  for (int j=0; j&lt; list.size();j++)         {             res.append(list.get(j));             if (j!=list.size()-1)             {                 res.append(&quot;,&quot;);             }         }         return res.toString();     } } <\/code><\/pre>\n<p>  <\/p>\n<h4>Config<\/h4>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u044f \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0435\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 <i>SocketServletContainer<\/i>, \u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 xml-\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u043d\u0430 java \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0438, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e.<br \/>  \u041b\u0438\u0447\u043d\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b DOM-\u043f\u0430\u0440\u0441\u0435\u0440.<\/p>\n<h4> QueueHandler <\/h4>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0443\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u0434\u0430\u0447(<i>TaskHandler<\/i>). \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044f \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u043b \u043d\u0430 \u043d\u0430\u0434\u0435\u0436\u043d\u0443\u044e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e threadPool. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0443\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 Executors.newFixedThreadPool(n).<\/p>\n<p>  \u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 stop, \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u043d\u043e \u043d\u043e\u0432\u044b\u0435 <i>TaskHandler<\/i>-\u044b \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442.  <\/p>\n<pre><code class=\"java\">public class QueueHandler {          private ExecutorService threadPool;     private int threadPoolSize;          public QueueHandler(int size)     {         threadPoolSize= size;         threadPool= Executors.newFixedThreadPool(threadPoolSize);     }              public void stop()     {         threadPool.shutdown();     }          public void addTaskToProcess(Task task, SocketSession session)     {         threadPool.execute(new TaskHandler(task, session));     } } <\/code><\/pre>\n<p>  <\/p>\n<h4>TaskHandler<\/h4>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0441\u0441\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c(<i>Task<\/i>).  <\/p>\n<pre><code class=\"java\">public class TaskHandler implements Runnable{          private Task task;     private SocketSession session;          public TaskHandler(Task task, SocketSession session)     {         this.task= task;                 this.session= session;     }               @Override     public void run()     {         \/\/\u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u043b\u0435\u0442 \u043f\u043e \u0438\u043c\u0435\u043d\u0438         Servlet servlet= SocketServletContainer.getInstance().getServlet(task.getServletName());         OutputBuffer output= new OutputBuffer();         \/\/\u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430 \u043d\u0435\u0442, \u0442\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443.         if (servlet==null)         {             output.setPar(&quot;error&quot;, &quot;servlet not found&quot;);             session.send(output, &quot;Error Message&quot;);             return;         }                  \/\/\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438            servlet.doRequest(new InputBuffer(task.getBuffer()),output, session);         \/\/\u041e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440.         session.send(output, task.getServletName());              } } <\/code><\/pre>\n<p>  <\/p>\n<h4>Task<\/h4>\n<p>  \u041e\u0431\u044a\u0435\u043a\u0442 <i>Task <\/i>\u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u044f \u00ab\u0438\u043c\u044f \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430\u00bb \u0438 \u00ab\u0431\u0443\u0444\u0435\u0440\u00bb. \u0411\u0443\u0444\u0435\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<br \/>  \u0421\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b write\/read \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430\/ \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Netty.  <\/p>\n<pre><code class=\"java\">public class Task {     private String servletName=&quot;&quot;;     private String buffer=&quot;&quot;;          public Task(String servletName, String buffer)     {         this.servletName= servletName;         this.buffer= buffer;     }          public Task()     {              }      public String getServletName() {         return servletName;     }      public String getBuffer() {         return buffer;     }     \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430     public void get(ChannelBuffer buffer)     {                  int length= buffer.readInt();         byte[] bytes= new byte[length];         buffer.readBytes(bytes);         String input= new String(bytes);         String[] data= input.split(java.util.regex.Pattern.quote(&quot;[sysDiv]&quot;));                  if (data.length&lt;2)         {             System.err.println(&quot;Parsing error&quot;);             return;         }         this.servletName= data[0];         this.buffer= data[1];     }     \/\/\u041f\u0438\u0448\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b     public void send(ChannelBuffer buffer)     {         String output= this.servletName + &quot;[sysDiv]&quot;+ this.buffer;         buffer.writeInt(output.getBytes().length);         buffer.writeBytes(output.getBytes());     }          public static Task read(ChannelBuffer buffer)     {         Task task= new Task();         task.get(buffer);         return task;     }          public static void write(Task task, ChannelBuffer buffer)     {         task.send(buffer);     }   } <\/code><\/pre>\n<p>  <\/p>\n<h6>\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/h6>\n<p>  \u041a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043b, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 netty \u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043a\u043e\u0434 \u0438 \u043f\u043e\u044f\u0441\u043d\u044e \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<h4> ServerPipelineFactory <\/h4>\n<p>  <\/p>\n<pre><code class=\"java\">public class ServerPipelineFactory implements ChannelPipelineFactory {     @Override     public ChannelPipeline getPipeline() throws Exception {         return Channels.pipeline(new Encoder(),new Decoder(),new NioHandler());     } } <\/code><\/pre>\n<p>  <\/p>\n<h4> Decoder <\/h4>\n<p>  \u041f\u0430\u043a\u0435\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435: \u043f\u0435\u0440\u0432\u044b\u0435 4 \u0431\u0430\u0439\u0442\u0430- \u0434\u043b\u0438\u043d\u0430 \u00ab\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445\u00bb \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u0430\u043b\u0435\u0435 \u0438\u0434\u0443\u0442 \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. <i>Decoder <\/i>\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u043e\u044f\u0445, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0435 \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.  <\/p>\n<pre><code class=\"java\">public class Decoder extends ReplayingDecoder&lt;DecoderState&gt; {          public enum DecoderState     {         READ_LENGTH,         READ_CONTENT;     }          public Decoder()     {         super(DecoderState.READ_LENGTH);     }     private int length;          @Override     public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {         ctx.sendUpstream(e);     }     @Override     public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {         ctx.sendUpstream(e);     }          @Override     protected Object decode(ChannelHandlerContext arg0, Channel arg1, ChannelBuffer buffer, DecoderState state)         {         switch (state)         {             case READ_LENGTH:                 length = buffer.readInt();                 checkpoint(DecoderState.READ_CONTENT);                              case READ_CONTENT:                 ChannelBuffer frame= buffer.readBytes(length);                 \/\/\u0427\u0438\u0442\u0430\u0435\u043c task \u0438\u0437 \u0441\u0435\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0435\u0433\u043e \u0432\u044b\u0448\u0435                 Task task= Task.read(frame);                 checkpoint(DecoderState.READ_LENGTH);                 return task;                              default:                 throw new Error( &quot;Shouldn't reach here&quot; );         }     } } <\/code><\/pre>\n<p>  <\/p>\n<h4>Encoder<\/h4>\n<p>  <\/p>\n<pre><code class=\"java\">public class Encoder extends OneToOneEncoder {          @Override     protected Object encode(ChannelHandlerContext channelhandlercontext, Channel channel, Object obj) throws Exception {          \/\/\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Task, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0438\u0434\u0430\u0435\u043c \u0435\u0433\u043e \u0432\u044b\u0448\u0435         if(!(obj instanceof Task))         {             return obj;         }                      Task task= (Task)obj;                  ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();         \/\/\u041f\u0438\u0448\u0435\u043c task \u0432 \u0441\u0435\u0442\u044c         Task.write(task, buffer);         return buffer;      } } <\/code><\/pre>\n<p>  <\/p>\n<h4>NioHandler<\/h4>\n<p>  \u042d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0442\u044c\u044e: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043e\u0431\u0440\u044b\u0432 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.  <\/p>\n<pre><code class=\"java\">public class NioHandler extends SimpleChannelUpstreamHandler {          private SocketSession session;     @Override     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {                  \/\/\u0422\u0443\u0442 \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0441\u0435\u0441\u0441\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u043a\u0435\u0442\u0430         session= new SocketSession(e.getChannel());         System.out.println(&quot;Has connect&quot;);     }          @Override     public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {         session.close();  }     @Override     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {         if(e.getChannel().isOpen())         {             \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Task \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 QueueHandler.             Task message= (Task)e.getMessage();             SocketServletContainer.getInstance().getQueueHandler().addTaskToProcess(message, session);         }     }          @Override     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {         \/\/ \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u041b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u0438 \u0441\u0435\u0441\u0441\u0438\u044e.         session.close();         e.getCause().printStackTrace(System.err);         ctx.getChannel().close();     } } <\/code><\/pre>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430<\/h4>\n<p>  <\/p>\n<pre><code class=\"java\">public class TS extends Servlet {          @Override     public void doRequest(InputBuffer input, OutputBuffer output, SocketSession session) {         output.setPar(&quot;request&quot;, input.getPar(&quot;message&quot;)+session.getId());     } } <\/code><\/pre>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043b\u0438 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430, \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e.  <\/p>\n<pre><code class=\"java\">public class App  {     public static void main( String[] args ) throws ContainerInitializeException     {         SocketServletContainer server= SocketServletContainer.getInstance();         server.registerServlet(new TS(), &quot;TS&quot;);         server.start();     } } <\/code><\/pre>\n<p>  <\/p>\n<h4>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432<\/h4>\n<p>  \u0427\u0442\u043e \u0436, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d, \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0417\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043f\u043e\u0434 \u043d\u0435\u0433\u043e \u044f \u043d\u0435 \u0441\u0442\u0430\u043b, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u0441\u043e\u043a\u0435\u0442, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"java\">socket = new Socket(&quot;127.0.0.1&quot;, 9999); DataOutputStream dos= new DataOutputStream(socket.getOutputStream()); DataInputStream dis= new DataInputStream(socket.getInputStream()); String buffer= &quot;TS[sysDiv]message=IloveJava&quot;;              dos.writeInt(buffer.getBytes().length+4); dos.writeInt(buffer.getBytes().length); dos.write(buffer.getBytes()); dos.flush(); <\/code><\/pre>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u0430\u043a \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b- \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0440\u0435\u0436\u0434\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0435\u0431\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u043b\u0443\u043f\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u0443 \u0442\u0435\u0441\u0442\u043e\u0432, \u0440\u0430\u0437 \u0443\u0436 \u043c\u044b \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c \u043f\u043e http.<br \/>  \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u0435\u0440\u0432\u043b\u0435\u0442, \u043a\u0440\u0443\u0442\u044f\u0449\u0438\u0439\u0441\u044f \u0432 Tomcat \u0438 \u0441\u0435\u0440\u0432\u043b\u0435\u0442, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p>  <i>\u0417\u0430\u043c:<\/i> \u042f \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u043b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c http-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043e\u043a\u0435\u0442\u0430\u0445, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 web-socket, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 Tomcat \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442, \u043c\u043d\u043e\u0439 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0433\u0440\u044b.<\/p>\n<p>  <b>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0430:<\/b>  <\/p>\n<ul>\n<li> \u041e\u0431\u0430 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a<\/li>\n<li> \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u043d\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f- \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u0417\u0430\u043c\u0435\u0440\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u0445\u043e\u0441\u0442\u0435 <\/li>\n<li> \u0412\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u044f\u0437\u044b\u043a\u0430 Java<\/li>\n<li> \u041c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0438 \u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b, \u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u0441\u0442 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432\u0435\u0441\u044c\u043c\u0430 \u00ab\u0433\u0440\u0443\u0431\u043e\u00bb<\/li>\n<li>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043f\u043e 10 000 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <\/li>\n<\/ul>\n<p>  \u0410 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0430\u043a\u043e\u0432: \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 1 \u00ab\u043f\u0443\u0441\u0442\u043e\u0433\u043e\u00bb \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430 \u0434\u043b\u044f Tomcat \u0437\u0430\u043d\u044f\u043b\u0430 <b>0, 99 \u043c\u0441<\/b>.<br \/>  \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0437\u0430 <b>0, 09 \u043c\u0441<\/b>.<\/p>\n<p>  \u041c\u044b \u0438\u043c\u0435\u0435\u043c 2 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u041d\u043e \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b\u0441\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442\u044b \u043f\u0440\u0438\u0448\u043b\u0430 \u043a\u043e \u043c\u043d\u0435 \u043d\u0435 \u0438\u0437-\u0437\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0430 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c.<\/p>\n<h4>TODO: <\/h4>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0447\u0442\u043e \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443:<\/p>\n<ol>\n<li>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0423 input-\u0431\u0443\u0444\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 validate(String mask), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u043c\u0430\u0441\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0438\u0445 \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443(\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c\u0443) \u0442\u0438\u043f\u0443. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: validate(\u201cmessage:String, count:int\u201d);<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0431\u0443\u0444\u0435\u0440 byte[], \u0430 \u043d\u0435 writeUTF8(), \u0445\u043e\u0442\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c. \u041c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c interface Crypto{}, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u043b \u0431\u044b 2 \u043c\u0435\u0442\u043e\u0434\u0430: code() \u0438 encode(). \u0418 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0430\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 SocketServletContainer(), \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u043c\u0435\u043d\u044b \u0438\u043b\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438.<\/li>\n<li>\u0420\u0430\u0431\u043e\u0442\u0443 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438(\u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 Tomcat) \u0438 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432.<\/li>\n<li>\u0411\u043e\u043b\u0435\u0435 \u00ab\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439\u00bb \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0441 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f<\/li>\n<li>\u041a\u0443\u0447\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043c\u0435\u043b\u043e\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/li>\n<\/ol>\n<p>  <\/p>\n<h4>\u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u043b\u0438 \u043c\u043e\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 NIO \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 \u0438 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u043e\u0434 \u0438\u043c\u0435\u044e\u0449\u0435\u0435\u0441\u044f \u0436\u0435\u043b\u0435\u0437\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. <br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0435 \u0437\u0430\u0431\u043e\u0442\u044f\u0441\u044c \u043e \u00ab\u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445\u00bb \u0432\u0435\u0449\u0430\u0445, \u0442\u0438\u043f\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435(\u043c\u043d\u0435, \u043f\u0440\u0438\u0432\u044b\u043a\u0448\u0435\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 tomcat, \u0432\u0441\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u043c:)).<\/p>\n<p>  \u041d\u043e \u044f \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043d\u0435 \u0440\u0435\u0448\u0438\u043b\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u0443 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u043a\u0441\u0442\u0430\u0442\u0438(\u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u0441\u0435\u0440\u0432\u0435\u0440-\u043a\u043b\u0438\u0435\u043d\u0442), \u043d\u043e, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e. \u0410 \u0432\u043e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c Tomcat, \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0433\u043e\u0434\u0430\u043c\u0438 \u0438 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<br \/>  \u042f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432 \u00ab\u0443\u0437\u043a\u0438\u0445\u00bb, \u043d\u043e \u043d\u0435\u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 http-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0436 \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0430\u0442\u0430.<\/p>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0434\u043b\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439. \u0421\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0449\u0438\u043b \u0441 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u0434\u0430. \u0421 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u0432\u044b\u0441\u043b\u0443\u0448\u0430\u044e \u0432\u0430\u0448\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0443. \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/188088\/\"> http:\/\/habrahabr.ru\/post\/188088\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">\n<h4> Disclaimer<\/h4>\n<p>  \u0412\u0441\u0435, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0438 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0437\u0432\u0430\u043d\u0438\u0435 \u00ab\u0438\u0441\u0442\u0438\u043d\u044b \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u00bb.<\/p>\n<h4> \u041f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u0430<\/h4>\n<p>  \u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435. \u042f \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0438\u0433\u0440. \u041c\u043e\u0438\u043c \u043b\u044e\u0431\u0438\u043c\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u0433\u0440\u044b. <br \/>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0434\u0435\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Apache Tomcat. \u041e\u043d \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u043e http \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443. \u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438\u0433\u0440\u044b \u0441\u0445\u0435\u043c\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f, \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<br \/>  \u041d\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0435\u0436\u0434\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439(\u0434\u0430, \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u0442\u0443\u0442 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0435\u0431\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c) \u0441\u0442\u0430\u043b\u0430 \u0438\u0434\u0435\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c, \u0442.\u043a. \u0432 \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435\\\u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u043e\u0441\u044c WebSocket API \u0434\u043b\u044f Tomcat, \u043d\u043e \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-188088","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/188088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=188088"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/188088\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=188088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=188088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=188088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}