рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЬрд╛рд╡рд╛ рдХреЛрдб рдХрдВрдЯреЗрдирд░ рд▓рдЧрд╛рддрд╛рд░ рдХрдиреЗрдХреНрд╢рди рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде

рддреНрдпрд╛рдЧ


рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рд╣реИ рдФрд░ "рдЕрдВрддрд┐рдо рд╕рддреНрдп" рдХрд╛ рд╢реАрд░реНрд╖рдХ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдирдорд╕реНрддреЗ рдореБрдЭреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреЗрдо рдмрдирд╛рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдореЗрд░реА рдкрд╕рдВрджреАрджрд╛ рджрд┐рд╢рд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдзрд╛рд░рд┐рдд рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдЧреЗрдо рд╣реИрдВред
Apache Tomcat рдХреЛ рдПрдХ рдЖрдЗрдбрд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд▓реЗрдЯ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ http рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рд╡реИрдз рд╣реИ, рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдордпрдкреВрд░реНрд╡ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рд╕реЗ рдПрдХ (рд╣рд╛рдБ, рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛) рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реНрдерд╛рдпреА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реА рдпреЛрдЬрдирд╛ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ / рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЯреЙрдорд╕реНрдХреИрдЯ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдПрдкреАрдЖрдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛рдиреА рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВред

рдЙрдкрдХрд░рдг


рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:


рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрд╡реЗрджрди рддрд░реНрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдХрдВрдЯреЗрдирд░ рдХреЛ рдореБрдЦреНрдп рд╡рд░реНрдЧ рд╕реЙрдХреЗрдЯрд╕рд░реНрд╡рд▓реЗрдЯрдХреЙрдирдЯреЗрдирд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╢реБрд░реВ / рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕рд░реНрд╡рд▓реЗрдЯ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рддрд░реАрдХреЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЗрдЦ рдореЗрдВ рд╕рд░реНрд╡рд▓реЗрдЯ рд╢рдмреНрдж рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЬреЗрд╕реАрдкреА рд╕рд░реНрд╡рд▓реЗрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд░реНрд╡рд▓реЗрдЯреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рджрд░рдЕрд╕рд▓, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕рд░реНрд╡рд▓реЗрдЯ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд░реНрд╡рд▓реЗрдЯреНрд╕ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдХрдиреЗрдХреНрд╢рди рд╕рддреНрд░ рд╡рд░реНрдЧ ( рд╕реЙрдХреЗрдЯрд╕реЗрдВрд╢рди ), рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛, рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ )ред рдЗрдирдХрдорд┐рдВрдЧ рдФрд░ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдмрдлрд╝рд░реНрд╕ ( InputBuffer рдФрд░ OutputBuffer ) рдХреА рдХрдХреНрд╖рд╛рдПрдВ рдХреНрд░рдорд╢рдГ рд▓рд╛рдЧреВ рдХреА рдЧрдИрдВред

рдпрд╣ рднреА рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬреЛ xml рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЙрд▓реНрд▓реЗрдЦ рдХреНрдпреВрд╣реИрдВрдбрд▓рд░ рдФрд░ рдЯрд╛рд╕реНрдХрд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

QueueHandler рдПрдХ рдЕрдиреБрд░реЛрдз рдкрдВрдХреНрддрд┐ рд╣реИрдВрдбрд▓рд░ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред
TaskHandler Runnable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд░рди рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдмрдорд┐рдЯ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред
рдЯрд╛рд╕реНрдХ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЙрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬреЛ рдЖ рдЧрдИ рд╣реИ (рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЛ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ (рд░реАрдб \ рд░рд╛рдЗрдЯ)ред

рдЕрдм рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рд╕рдВрдЧрдарди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдореИрдВ рдиреЗрдЯреНрдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдмреНрдпреМрд░рд╛ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХрд╛ рд╣реИ (рдиреЗрдЯреА рдкрд░ рдЙрдирдХреЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП Rena4ka habrayuzer рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж)ред рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рд╣рдмреНрд░ рдпрд╛ рдкреНрд░рд▓реЗрдЦрди рдкрд░ рдкрдврд╝реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЬрд┐рд╕реЗ рдиреЗрдЯреА рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред
ServerPipelineFactory рд╡рд░реНрдЧ рдПрдХ ChannelPipeline рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Netty рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореБрдЭреЗ 3 рд╡рд░реНрдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рд╛: рд╡рд┐рдХреЛрдбрдХ , рдПрдирдХреЛрдбрд░ , NioHandler ред
рдкрд╣рд▓реЗ 2 рдкреИрдХреЗрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдП рдереЗред рдбрд┐рдХреЛрдбрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдЯрд╛рд╕реНрдХ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред рдПрдирдХреЛрдбрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЯрд╛рд╕реНрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
NioHandler , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рдмрдВрдзрдХ рд╣реИ: рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рд╕рддреНрд░реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред

рдкреНрд░реЛрдЯреЛрдХреЙрд▓


рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╢рд╛рдмреНрджрд┐рдХ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдирддреАрдЬрддрди, рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рднреЗрдЬрддрд╛ рд╣реИ: servlet_name [sysDiv] request_ametametersред
рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕реВрдЪреА рдХрд╛ рдкреНрд░рд╛рд░реВрдк: name1 = value1, name2 = value2, ...

рдЙрджрд╛рд╣рд░рдг : "рдЯреАрдПрд╕ [sysDiv] рд╕рдВрджреЗрд╢ = рд╣реИрд▓реЛ habrahabr.ru"ред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╕рдордорд┐рдд рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЙрд╕ рд╕рд░реНрд╡рд▓реЗрдЯ рдХрд╛ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреАред

рдФрд░ рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдкрд╛рд╕ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдмрд╛рддред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд░реВрдк


<?xml version="1.0" encoding="utf-8"?> <config> <address>localhost</address> <port>9999</port> <workThreadCount>2</workThreadCount> <processThreadCount>2</processThreadCount> </config> 


workThreadCount - рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдиреЗрдЯреА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред
processThreadCount - рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдХрддрд╛рд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЙрдирдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╣реИ, рд╕рднреА рд╕рд░реНрд╡рд░ рдХреЛрдб рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЧрдардиред

SocketServletContainer


рдпрд╣ рд╡рд░реНрдЧ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ "рдХреЗрдВрджреНрд░реАрдп" рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рддрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреА 1 рдкреНрд░рддрд┐ рдирд┐рд╣рд┐рдд рд╣реИ (рдЗрд╕рд▓рд┐рдП, рдПрдХ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред
 public class SocketServletContainer { private Channel channel; private ServerBootstrap networkServer; private QueueHandler queueHander; private Map<String, Servlet> servlets; private Config conf; private static SocketServletContainer server= null; private static List<SocketSession> list= new ArrayList<SocketSession>(); public List<SocketSession> getListSession() { return list; } static public SocketServletContainer getInstance() { if (server==null) { server= new SocketServletContainer(); } return server; } private SocketServletContainer() { conf= new Config("conf.xml"); // ,   -  Exception. try { conf.read(); } catch(Exception e) { throw new ContainerInitializeException(e.toString()); } servlets= new HashMap<String, Servlet>(); } public void start() { // 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("backlog", 500); networkServer.setOption("connectTimeoutMillis", 10000); networkServer.setPipelineFactory(new ServerPipelineFactory()); channel = networkServer.bind(new InetSocketAddress(conf.getAddress(), conf.getPort())); //    queueHander= new QueueHandler(conf.getProcessThreadCount()); System.out.println("Ready"); } // ┬л┬╗   public void stop() { if (channel.isOpen()) { ChannelFuture future= channel.close(); future.awaitUninterruptibly(); } queueHander.stop(); } public QueueHandler getQueueHandler() { return this.queueHander; } //      public void registerServlet(Servlet servlet, String name) { //    -    HashMap. synchronized(servlets) { if (!servlets.containsKey(name)) { servlets.put(name, servlet); } } } public Servlet getServlet(String name) { return servlets.get(name); } } 

рд╕рд░реНрд╡рд▓реЗрдЯ


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред DoRequest рдореЗрдердб рдЙрд╕ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдкреИрдХреЗрдЯ рдЗрд╕ рд╕рд░реНрд╡рд▓реЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЖрддрд╛ рд╣реИред
рдЬрд╝рдо: рд╕рддреНрд░ рдХреЛ doRequest рдкрджреНрдзрддрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рд░реНрд╡рд▓реЗрдЯ рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕рддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреИрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордпред
 abstract public class Servlet { abstract public void doRequest(InputBuffer input, OutputBuffer output, SocketSession session); } 

SocketSession


рдкреНрд░рддреНрдпреЗрдХ рд╕рддреНрд░ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдИрдбреА рд╣реЛрддреА рд╣реИред 20,000 рдЬреБрдбрд╝реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреА рдЙрдкрдирд╛рдореЛрдВ рдХрд╛ рдПрдХ рдкреВрд▓ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕реАрдорд╛ рдкрд╛рд░ рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рд╕рддреНрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рд╕рд░реНрд╡рд░, рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдХрд░реЗрдЧрд╛, рдПрдХ рдЧреИрд░-рдХреНрд▓рд╛рдЗрдВрдЯ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ рдФрд░ рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред
рдкреВрд▓ рдЖрдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
 public class SocketSession { private static byte[] idPool; public int generateId() { synchronized(idPool) { if (idPool==null) { idPool= new byte[20000]; for (int j=0;j<idPool.length;j++) { idPool[j]=0; } } for (int j=0;j<idPool.length;j++) { if (idPool[j]==0) { idPool[j]=1; return j; } } return -1; } } private int id; private Channel channel; //      List  . public SocketSession(Channel channel) { this.channel= channel; this.id= generateId(); //    if (this.id==-1) { OutputBuffer out= new OutputBuffer(); out.setPar("error", "Connection limit error"); send(out, "System Servlet"); //  System.err.println("Connection limit error"); return; } SocketServletContainer.getInstance().getListSession().add(this); } public int getId() { return id; } //  .            . public void send(OutputBuffer output, String servletName) { synchronized(channel) { channel.write(new Task(servletName, output.toString())); } } // , ,      - ┬л┬╗  public void close() { synchronized(idPool) { idPool[this.id]= 0; } channel.close(); SocketServletContainer.getInstance().getListSession().remove(this); } } 

InputBuffer


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд╕реНрд░реЛрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреНрд╡реЗрд░реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
 public class InputBuffer { private Map<String, String> map= new HashMap<String, String>(); public InputBuffer(String source) { String[] par= source.split(","); for (int j=0; j< par.length; j++) { if (!par[j].contains("=")) { continue; } String[] data= par[j].split("="); if (data.length<2) { System.err.println("Parsing Error"); continue; } map.put(data[0], data[1]); } } public String getPar(String key) { return map.get(key); } } 

OutputBuffer


рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИред рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ toString () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЙрдХреЗрдЯ рд╕реЗрд╢рди рд╡рд░реНрдЧ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 public class OutputBuffer { private List<String> list= new ArrayList<String>(); public void setPar(String key, String par) { list.add(key+"="+par); } @Override public String toString() { StringBuilder res= new StringBuilder(); for (int j=0; j< list.size();j++) { res.append(list.get(j)); if (j!=list.size()-1) { res.append(","); } } return res.toString(); } } 

рдХреЙрдиреНрдлрд╝рд┐рдЧ


рдореИрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЙрдХреЗрдЯрд╕рд░реНрд╡рд▓реЗрдЯрдХреЙрдирдЯреЗрдирд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЬрд╛рд╡рд╛ рдкрд░ рдПрдХреНрд╕рдПрдордПрд▓ рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдкрд╛рдПрдВрдЧреЗред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ DOM рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

QueueHandler


рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЕрдВрджрд░, рдЗрд╕рдореЗрдВ рдПрдХ рдереНрд░реЗрдб рдкреВрд▓ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ ( рдЯрд╛рд╕реНрдХрд╣реИрдВрдбрд▓рд░ ) рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдпреЛрдЬрдирд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рд╕рд┐рджреНрдз рдзрд╛рдЧрд╛рдкреВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред Executors.newFixedThreadPool (n) рдлреИрдХреНрдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм рд░реЛрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрддрд╛рд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирдП рдЯрд╛рд╕реНрдХрд╣реИрдВрдбрд░реНрд╕ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
 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)); } } 

TaskHandler


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рднреА рд╣реИред рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рд╕рддреНрд░ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 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() { //     Servlet servlet= SocketServletContainer.getInstance().getServlet(task.getServletName()); OutputBuffer output= new OutputBuffer(); //  ,   . if (servlet==null) { output.setPar("error", "servlet not found"); session.send(output, "Error Message"); return; } //     servlet.doRequest(new InputBuffer(task.getBuffer()),output, session); //  . session.send(output, task.getServletName()); } } 

рдХрд╛рд░реНрдп


рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдлрд╝реАрд▓реНрдб "рд╕рд░реНрд╡рд▓реЗрдЯ рдирд╛рдо" рдФрд░ "рдмрдлрд░" рд╣реИред рдПрдХ рдмрдлрд░ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред
рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЗрдЯрд┐рдХ рд▓рд┐рдЦрдиреЗ / рдкрдврд╝рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
 public class Task { private String servletName=""; private String buffer=""; public Task(String servletName, String buffer) { this.servletName= servletName; this.buffer= buffer; } public Task() { } public String getServletName() { return servletName; } public String getBuffer() { return buffer; } //    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("[sysDiv]")); if (data.length<2) { System.err.println("Parsing error"); return; } this.servletName= data[0]; this.buffer= data[1]; } //    public void send(ChannelBuffer buffer) { String output= this.servletName + "[sysDiv]"+ 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); } } 

рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ

рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рд╕рд┐рд░реНрдл рдХреЛрдб рджреВрдВрдЧрд╛ рдФрд░ рдЙрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдЬреЛ рддрд░реНрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

ServerPipelineFactory


 public class ServerPipelineFactory implements ChannelPipelineFactory { @Override public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new Encoder(),new Decoder(),new NioHandler()); } } 

рдбрд┐рдХреЛрдбрд░


рдкреИрдХреЗрдЯ рдирд┐рдореНрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдЖрддрд╛ рд╣реИ: рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ "рдЙрдкрдпреЛрдЧреА" рдбреЗрдЯрд╛ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИрдВ, рдлрд┐рд░ рдбреЗрдЯрд╛ рд╣реАред рдбрд┐рдХреЛрдбрд░ рдкрдврд╝рдиреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдКрдкрд░ рд╕реНрдерд┐рдд рдкрд░рддреЛрдВ рдореЗрдВ, рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХреЗрдВ рдХрд┐ рдбреЗрдЯрд╛ рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИред
 public class Decoder extends ReplayingDecoder<DecoderState> { 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); // task       Task task= Task.read(frame); checkpoint(DecoderState.READ_LENGTH); return task; default: throw new Error( "Shouldn't reach here" ); } } } 

рдПрдирдХреЛрдбрд░


 public class Encoder extends OneToOneEncoder { @Override protected Object encode(ChannelHandlerContext channelhandlercontext, Channel channel, Object obj) throws Exception { //    Task,      if(!(obj instanceof Task)) { return obj; } Task task= (Task)obj; ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); // task   Task.write(task, buffer); return buffer; } } 

NioHandler


рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореБрдЦреНрдп рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ: рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛, рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ред
 public class NioHandler extends SimpleChannelUpstreamHandler { private SocketSession session; @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { //     session= new SocketSession(e.getChannel()); System.out.println("Has connect"); } @Override public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { session.close(); } @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { if(e.getChannel().isOpen()) { //  Task       QueueHandler. Task message= (Task)e.getMessage(); SocketServletContainer.getInstance().getQueueHandler().addTaskToProcess(message, session); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { //  .  ,    . session.close(); e.getCause().printStackTrace(System.err); ctx.getChannel().close(); } } 


рд╕рд░реНрд╡рд▓реЗрдЯ рдЙрджрд╛рд╣рд░рдг


 public class TS extends Servlet { @Override public void doRequest(InputBuffer input, OutputBuffer output, SocketSession session) { output.setPar("request", input.getPar("message")+session.getId()); } } 


рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧ рд╣реИ


рджрд░рдЕрд╕рд▓, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЛрдб рдХреА рдЗрддрдиреА рд╕рд╛рд░реА рд▓рд╛рдЗрдиреЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред
 public class App { public static void main( String[] args ) throws ContainerInitializeException { SocketServletContainer server= SocketServletContainer.getInstance(); server.registerServlet(new TS(), "TS"); server.start(); } } 

рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг


рдЦреИрд░, рдХрдВрдЯреЗрдирд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рд░реИрдкрд░ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рд╕реАрдзреЗ рд╕реЙрдХреЗрдЯ рдкрд░ рд▓рд┐рдЦрдиреЗ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 socket = new Socket("127.0.0.1", 9999); DataOutputStream dos= new DataOutputStream(socket.getOutputStream()); DataInputStream dis= new DataInputStream(socket.getInputStream()); String buffer= "TS[sysDiv]message=IloveJava"; dos.writeInt(buffer.getBytes().length+4); dos.writeInt(buffer.getBytes().length); dos.write(buffer.getBytes()); dos.flush(); 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦ рдХреА рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕рдордпрдкреВрд░реНрд╡ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдПрдХ рджреЛ рдкрд░реАрдХреНрд╖рдг рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рднреА рдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рдерд╛ред

рджрд░рдЕрд╕рд▓, рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ http рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд▓реЗрдЯ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░реНрд╡рд▓реЗрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЯреЙрдордХреИрдЯ рдореЗрдВ рдШреВрдорддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдорд┐рдд рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд░реНрд╡рд▓реЗрдЯ рд╣реИред

рдЬрд╝рдо: рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ http рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЧреЗрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЯреЙрдордХреИрдЯ рдиреЗ рдЬрд┐рд╕ рд╡реЗрдм-рд╕реЙрдХреЗрдЯ рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдерд╛, рдЙрд╕ рдкрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкрд░реАрдХреНрд╖рдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ: рдЯреЙрдореНрдХрдЯ рдХреЗ рд▓рд┐рдП рдФрд╕рддрди 1 "рдЦрд╛рд▓реА" рд╕рд░реНрд╡рд▓реЗрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг , 0, 99 рдПрдордПрд╕ рд▓рд┐рдпрд╛ред
рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрдВрдЯреЗрдирд░ 0.09 рдПрдордПрд╕ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ рдЬреЛ рдкрд░рд┐рдорд╛рдг рдХреЗ рдПрдХ рдХреНрд░рдо рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рдЧрддрд┐ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рдЖрдпрд╛, рдмрд▓реНрдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг, рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрддреЛрд╖рдЬрдирдХ рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╕реВрдЪреА:


рдПрдХ рдЫреЛрдЯреА рд╕реВрдЪреА рднреА рдереА рдЬрд┐рд╕реЗ рдЕрднреА рднреА рдПрдХ рд╕рдорд╛рди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рднреА рджреВрдВрдЧрд╛:

  1. рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдорд╛рдиреНрдпрддрд╛ред рдЖрдк рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рд╕реНрдХ) рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдорд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд (рди рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ: рдорд╛рдиреНрдп рдХрд░реЗрдВ ("рд╕рдВрджреЗрд╢: рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЧрд┐рдирддреА: int");
  2. рдбреЗрдЯрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯ [] рдмрдлрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд░рд╛рдЗрдЯрдЖрдЙрдЯрдПрдл 8 () рдирд╣реАрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЯреЗрдХреНрд╕реНрдЯ рд╣реИред рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреНрд░рд┐рдкреНрдЯреЛ {} рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ 2 рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА: рдХреЛрдб () рдФрд░ рдПрдирдХреЛрдб ()ред рдФрд░ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд░рд┐рд╡рд░реНрддрди рдпрд╛ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реЙрдХреЗрдЯрд╕рд░реНрд╡рд▓реЗрдЯрдХреЙрдирдЯреЗрдирд░ () рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЯреЙрдордХреИрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рд╡рд┐рд▓рдВрдмрд┐рдд рд╕рд░реНрд╡рд▓реЗрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рдиред
  4. рд╕реАрдорд╛рдВрдХрди рдкрд░рд┐рд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╛рд░реНрд╕рд┐рдВрдЧ
  5. рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЫреЛрдЯреА рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдХрдВрдЯреЗрдирд░ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдиреЗ рдореЗрд░реА рдЙрдореНрдореАрджреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд┐рдпрд╛ред NIO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдореЗрдВ рдЖрд░реНрдерд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдпрдерд╛рд╕рдВрднрд╡ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░реЗред
рдХрдВрдЯреЗрдирд░ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдЖрдкрдХреЛ "рдирд┐рдореНрди-рд╕реНрддрд░реАрдп" рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдЬреИрд╕реЗ рдХрд┐ рдкреИрдХреЗрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдЗрддрдиреЗ рдкрд░ (рд╕рдм рдХреБрдЫ рдореБрдЭреЗ рд▓рдЧрддрд╛ рдерд╛, рдЯреЙрдордХреИрдЯ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╣рд┐рдореНрдордд рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА (рд╕рд░реНрд╡рд░-рдХреНрд▓рд╛рдЗрдВрдЯ рдлреАрдбрдмреИрдХ рдХреЗ рд▓рд┐рдП), рд▓реЗрдХрд┐рди, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдФрд░ рд╣рдЬрд╛рд░реЛрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдмрд┐рдд рд╣реБрдП рдЯреЙрдордХреИрдЯ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдЙрдард╛рддреА рд╣реИред
рдореИрдВ "рд╕рдВрдХреАрд░реНрдг", рд▓реЗрдХрд┐рди рдЧреИрд░-рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ http рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЪреИрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╢рд╛рдпрдж рдореИрдВ рддрд░реНрдХ рдФрд░ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рджреВрд░ рдЪрд▓рд╛ рдЧрдпрд╛ред рд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдФрд░ рд╕реБрдЭрд╛рд╡ рд╕реБрдирдХрд░ рдореБрдЭреЗ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реБрдИред

Source: https://habr.com/ru/post/In188088/


All Articles