
рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдПрдХ рдЖрд╡реЗрджрди рдореЗрдВ рдмреАрдиреНрд╕ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЬрд╛рдЗрдерди рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред
рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рд░
рд╣рд░ рдХреЛрдИ рдЬреЛ рдХрднреА рднреА рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдЖрдпрд╛ рд╣реИ, рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдмрд╣реБрдд рдзреАрд░реЗ-рдзреАрд░реЗ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред
рдбреНрдпреВрдЯреА рдкрд░, рдореБрдЭреЗ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдХреЛрдб рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╣реА рдкреНрд░рд╛рдЪреАрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдерд╛ред рд╕рдмрд╕реЗ рдмреБрд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдорд┐рдирдЯ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ рд╕рд╛рдд рдорд┐рдирдЯ рддрдХ рдФрд░ рддреАрди рдорд┐рдирдЯ рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдлрд┐рд░, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдб рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рд╢рд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд░рдХ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ NullPointerException рдХреЛ рдЗрддрдиреЗ рд▓рдВрдмреЗ рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рдкрдХрдбрд╝реЗрдВ-> рдХрдВрдкрд╛рдЗрд▓-> рд╕реНрдЯрд╛рд░реНрдЯ рдбрд┐рдкреЛ-> рд░реБрдХреЛ-> рд╕реНрдореЛрдХ-> рдкреНрд░рддреАрдХреНрд╖рд╛-> рдЯреЗрд╕реНрдЯред
рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рднреА рд╕рдВрднрд╡ рд╣реИред рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреЛрдб рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░ рд░рд╣реЗ рдХрд╛рд░реНрдп рдХреЗ рдХрд░реАрдм рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдЬрд╛рд╡рд╛ 1.4 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛ 1.5 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдерд╛, рд╡реЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓реМрдЯреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкреЙрдк рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЧреБрдордирд╛рдо java.lang.Object рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдХреБрдЫ рджрд┐рдиреЛрдВ рддрдХ рдХреИрдХреНрдЯрд╕ рдЦрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рд╣рд░ рджрд┐рди
рдкрд╛рдВрдЪ рд╕реЗ рдмреАрд╕ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд▓рд┐рдЦрдХрд░ рдХрд╛рдо рдкрд░ рдЬрд╛рдиреЗ рд▓рдЧрд╛ рд╣реВрдВред
рдЗрд╕ рддрд░рд╣ рдХреА рдмрд░реНрдмрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдпрд╣ рдерд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреЛрдб рдХреЛ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдбрд╛рдпрдиреЗрдорд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдкреЗрдВрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдкрд╣рд▓реЗ рдЙрд╕ рдкрд░ рдФрд░ рдлрд┐рд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ред рдмреЗрд╢рдХ, рд╕рдорд╛рдзрд╛рди рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдХрдВрд╕реЛрд▓ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЧрддрд┐рдХреА рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдПрдкреНрд▓реЗрдЯ рдореЗрдВ рдХрдВрд╕реЛрд▓ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдлреНрд░реАрдмреАрдПрд╕рдбреА рдореЗрдВ рдПрдкреНрд▓реЗрдЯреНрд╕ рдмрд╣реБрдд рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЕрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ), рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИред
рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ
рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐ "рдХрд╛рдВрдЯрд╛" рдкрд╛рдЗрдк рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ (рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рдкрд┐рдЪрдХрд╛рд░реНрдХреНрд╕ рдЙрдирд╕реЗ рд░рд╣рддреЗ рд╣реИрдВ) рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВрдиреЗ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдкрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдУрд░ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬрдЧрд░ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдкрд╕рдВрдж рдкрд░ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рджреВрд░ рджреЗрдЦрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛:
- рдмреАрдиреНрд╕рд╣реЗрд▓ - рдЯреЗрд▓рдиреЗрдЯ рдХрдВрд╕реЛрд▓ рдХреА рд╡рд┐рдХрдЯрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛, рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдПрдкреНрд▓реЗрдЯ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИред
- JRuby - рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░рдХреЛрдк рдХреЗ рджреМрд░рд╛рди рд░реЗрд▓ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛ рдерд╛ред рддреНрд╡рд░рд┐рдд рдЧреЛрдЧрд▓рд┐рдВрдЧ рдиреЗ рдХреБрдЫ рдХреЛрд░рдмрд╛ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ред рднрдпрднреАрдд рдФрд░ рдмрдВрдж ...
- рдЧреНрд░реВрд╡реА
рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рдЬреИрд╕рд╛ рдореИрдВ рд╕рд╛рдХрд╛рдИ рдореЗрдВ рдЪрд╛рд╣рддреА рдереАред рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд╛рдареА рдФрд░ рд╡реЗрд╢реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдбрд┐рдкреЗрдВрдбреЗрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдврд╛рдВрдЪреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛рдпрд╛ рдирд╣реАрдВ рд╣реИред
Jython
рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, "рдмреИрдЯрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ," рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдорд╛рдирдХ рдкреИрдХреЗрдЬ рдореЗрдВ рднреА рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛ рдХреА рдЕрдкрдиреА рдмреИрдЯрд░реА рд╣реИред рдЬреЗрд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИ, рд▓реЗрдХрд┐рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреНрдпреЛрдереЙрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реЗрдЯрдкреНрдЯреВрд▓ рдХреЛ рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реБрдЖ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рджреЗрд╢реА рдкрд╛рдпрдерди рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХреЗред
рдореИрдВрдиреЗ
RPYC рдХреЛ Jython рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде
рдЖрдЬрд╝рдорд╛рдпрд╛ (рд░рд╛рдд
рдмреЗрдХрд╛рд░ рдЧрдИ)ред рдореИрдВрдиреЗ
рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдореИрдирд╣реЛрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рд╛ред рдореИрдВрдиреЗ рдЬреНрдпрдерди рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдЦрд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдорд░реНрдЬ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рдЗрдерди рдХреЗ рд▓рд┐рдП рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдлрд┐рдХреНрд╕рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реНрдирд╛рддрдХ рдмрдирдиреЗ рдХрд╛ рдЦрддрд░рд╛ рдерд╛ред
рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛
github.com/EnigmaCurry/jython-shell-server рдФрд░ рдПрд╣рд╕рд╛рд╕: рдХреЛрдИ рд░реАрдбрд▓рд╛рдЗрди, рдХреЛрдИ рдЦреБрд╢реА рдирд╣реАрдВред рдЯреЗрд▓рдиреЗрдЯ рд░реАрдбрд▓рд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред 80 рд▓рдВрдмрд╛рдИ рдХреЗ рдкрд╛рддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЦрдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкрд╣рд▓реА рд╡рд╕реНрддреБ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЖрдк рдорд╛рдЙрд╕ рдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЪрд┐рдкрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рджреЗрд╢реА рдмреИрд╢ рдЬреИрд╕рд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд╛рд╣рд┐рдП рдерд╛ред
рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕рд░реНрд╡рд░
рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ XMLRPC рдХреЛ рд╕рд░реНрд╡рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ред рдЕрдЧрд▓реЗ рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдореЗрдВ рдЙрд╕рдиреЗ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдмрджрд▓рд╛ред рдЕрдЧрд▓реЗ 20 рдорд┐рдирдЯ рдореЗрдВ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖред
Jython рд╕рд░реНрд╡рд░ рдХреЛрдб:
from SimpleXMLRPCServer import * <br/>
from os import path<br/>
from code import InteractiveConsole as BaseInteractiveConsole<br/>
<br/>
class Stdout ( object ) :<br/>
""" stdout """ <br/>
def __init__ ( self ) :<br/>
self . buffer = '' <br/>
<br/>
def get_buffer ( self ) :<br/>
""" """ <br/>
bc = self . buffer <br/>
self . buffer = '' <br/>
return bc<br/>
<br/>
def write ( self , bs ) :<br/>
""" """ <br/>
self . buffer += bs<br/>
return len ( bs ) <br/>
<br/>
class InteractiveConsole ( BaseInteractiveConsole ) :<br/>
""" , """ <br/>
<br/>
def __init__ ( self , locals ) :<br/>
""" """ <br/>
BaseInteractiveConsole. __init__ ( self , locals ) <br/>
# <br/>
self . stdout = sys . stdout = sys . stderr = Stdout ( ) <br/>
<br/>
def push ( self , line ) :<br/>
result = BaseInteractiveConsole. push ( self , line ) <br/>
return ( result, self . stdout . get_buffer ( ) ) # <br/>
<br/>
<br/>
<br/>
class Server ( SimpleXMLRPCServer ) :<br/>
"""XMLRPC-, """ <br/>
<br/>
def __init__ ( self , ls, * args, ** kwargs ) :<br/>
SimpleXMLRPCServer . __init__ ( self , * args, ** kwargs ) <br/>
self . register_introspection_functions ( ) <br/>
# <br/>
self . register_instance ( InteractiveConsole ( ls ) )
рдЧреНрд░рд╛рд╣рдХ
рд╕реАрдПрдордбреА рдХреЛ рдореВрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЖрдЙрдЯ рдСрдл рдмреЙрдХреНрд╕ рд░реАрдбрд▓рд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред
рдкрд╛рдпрдерди рдореЗрдВ рдЗрд╕ рдмрд╛рд░ рд╕рд░реНрд╡рд░ рдХреЛрдб (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдереЙрди рдореЗрдВ Cmd рд░реАрдбрд▓рд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ):
from cmd import Cmd as BaseCmd<br/>
from code import InteractiveConsole as BaseInteractiveConsole<br/>
import re , sys <br/>
from xmlrpclib import ServerProxy<br/>
<br/>
class Cmd ( BaseCmd ) :<br/>
""" -""" <br/>
reg = re . compile ( '^ \s *' ) <br/>
def __init__ ( self , host, port ) : <br/>
BaseCmd. __init__ ( self ) <br/>
self . s = ServerProxy ( 'http://%s:%d' % ( host, int ( port ) ) ) # <br/>
self . prompt = '>>> ' # <br/>
self . leading_ws = '' # <br/>
self . is_empty = False # <br/>
<br/>
def precmd ( self , line ) :<br/>
""" ,<br/>
""" <br/>
# , .. default <br/>
self . leading_ws = self . reg . match ( line ) . group ( 0 ) <br/>
# , .. <br/>
self . is_empty = ( line == '' ) <br/>
return line # , <br/>
<br/>
def default ( self , line ) : <br/>
if ( self . is_empty ) : # y <br/>
line = '' <br/>
line = self . leading_ws + line # <br/>
( result, output ) = self . s . push ( line ) # <br/>
# <br/>
self . prompt = ( '... ' if result else '>>> ' ) <br/>
sys . stdout . write ( output ) # :) <br/>
<br/>
if __name__ == '__main__' :<br/>
HOST, PORT = sys . argv [ 1 : ] <br/>
Cmd ( HOST, PORT ) . cmdloop ( )
рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдЖрд╡рд░рдг
рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдмреАрдиред рдпрд╣ рдХрд╣реАрдВ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
package net.rjyc ; <br/>
<br/>
import org.python.util.PythonInterpreter ; <br/>
import java.util.* ; <br/>
<br/>
public class Server { <br/>
private PythonInterpreter i ; <br/>
public PythonInterpreter getInterpreter ( ) { <br/>
return i ; <br/>
} <br/>
public Server ( String host, int port ) { <br/>
this ( host, port, new HashMap < String, Object > ( ) ) ; <br/>
} <br/>
public Server ( String host, int port, Map < String, Object > locals ) { <br/>
i = new PythonInterpreter ( ) ; <br/>
// <br/>
i. set ( "host" , host ) ; <br/>
i. set ( "port" , port ) ; <br/>
i. set ( "ls" , locals ) ; <br/>
} <br/>
<br/>
public void start ( ) { <br/>
// <br/>
i. exec ( "from rjyc import Server; Server(dict(ls), (host, port), logRequests = False).serve_forever()" ) ; <br/>
} <br/>
}
рдХреЗ рдЙрдкрдпреЛрдЧ
рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕рд░реНрд╡рд▓реЗрдЯ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬреЛ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
import javax.servlet.http.* ; <br/>
import java.util.* ; <br/>
import java.io.* ; <br/>
<br/>
public class Hello extends HttpServlet { <br/>
public final Map < String, String > links = new HashMap < String, String > ( ) ; <br/>
{ <br/>
links. put ( "Python" , "http://python.org" ) ; <br/>
links. put ( "Java" , "http://java.net" ) ; <br/>
} <br/>
@ Override protected void doGet ( HttpServletRequest request, HttpServletResponse response ) <br/>
throws IOException { <br/>
PrintWriter writer = response. getWriter ( ) ; <br/>
for ( Map . Entry < String, String > e: links. entrySet ( ) ) <br/>
writer. println ( "<a href= \" " +e. getValue ( ) + " \" >" +e. getKey ( ) + "</a>" ) ; <br/>
writer. close ( ) ; <br/>
} <br/>
}
рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЬрд╡рд╛рдм рдХреНрдпрд╛ рд╣реИ:
siasia@siasia ~ % wget http:
рдЕрдм рд╣рдо рдЗрд╕рдореЗрдВ рдЕрдкрдиреЗ рдХрдВрд╕реЛрд▓ рдХреЛ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗред
import javax.servlet.http.* ; <br/>
import java.util.* ; <br/>
import java.io.* ; <br/>
import net.rjyc.Server ; <br/>
<br/>
public class Hello extends HttpServlet { <br/>
public final Map < String, String > links = new HashMap < String, String > ( ) ; <br/>
{ <br/>
links. put ( "Python" , "http://python.org" ) ; <br/>
links. put ( "Java" , "http://java.net" ) ; <br/>
Thread t = new Thread ( ) { <br/>
@ Override public void run ( ) { <br/>
Map < String, Object > locals = new HashMap < String, Object > ( ) ; <br/>
locals. put ( "this" , Hello. this ) ; <br/>
new Server ( "localhost" , 8081 , locals ) . start ( ) ; <br/>
} <br/>
} ; <br/>
t. start ( ) ; <br/>
} <br/>
@ Override protected void doGet ( HttpServletRequest request, HttpServletResponse response ) <br/>
throws IOException { <br/>
PrintWriter writer = response. getWriter ( ) ; <br/>
for ( Map . Entry < String, String > e: links. entrySet ( ) ) <br/>
writer. println ( "<a href= \" " +e. getValue ( ) + " \" >" +e. getKey ( ) + "</a>" ) ; <br/>
writer. close ( ) ; <br/>
} <br/>
}
рдФрд░ рдЗрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
siasia@siasia ~ % python client.py localhost 8081 >>> this examples.Hello@13ebc5c >>> this.links {Python=http://python.org, Java=http://java.net} >>> this.links['Scala'] = 'http://scala-lang.org' >>> this.links {Scala=http://scala-lang.org, Python=http://python.org, Java=http://java.net}
рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
siasia@siasia ~ % wget http://localhost:8080 -O - 2>/dev/null <a href="http://scala-lang.org">Scala</a> <a href="http://python.org">Python</a> <a href="http://java.net">Java</a>
Maven
рдпрджрд┐ рдЖрдк рдорд╛рд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдорд╛рд╡реЗрди рдХрд▓рд╛рдХреГрддрд┐ рддреИрдпрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИред
- рдЕрдкрдиреЗ pom.xml рдореЗрдВ рднрдВрдбрд╛рд░ рдЬреЛрдбрд╝реЗрдВ:
<рднрдВрдбрд╛рд░>
<id> Rjyc рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА </ id>
<url> http://siasia.github.com/maven2 </ url>
</ рднрдВрдбрд╛рд░>
- Rjyc рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:
<рдирд┐рд░реНрднрд░рддрд╛>
<groupId> org.python </ groupId>
<рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп> rjyc </ рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп>
<рд╕рдВрд╕реНрдХрд░рдг> 1.0-SNAPSHOT </ рд╕рдВрд╕реНрдХрд░рдг>
</ рдирд┐рд░реНрднрд░рддрд╛>
- рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╕рд░реНрд╡рд░ рдЖрдпрд╛рдд рдХрд░реЗрдВ:
import net.rjyc.Server;
- рдЗрд╕реЗ рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдЪрд▓рд╛рдПрдВред
- рдХреНрд▓рд╛рдЗрдВрдЯ http://github.com/siasia/rjyc/raw/master/client.py рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
python client.py [host] [port]
- рд▓рд╛рдн !!!
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдЦреБрд╢ рдХрд░рддрд╛ рд╣реИред
Fork me on github
http://github.com/siasia ред