рд╢реБрдн рджреЛрдкрд╣рд░, рдЕрднрд┐рднрд╛рд╡рдХ!
рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдорд╣рд╛рди рджрд┐рд╡рд╕ рдкрд░ рд╕рднреА рдХреЛ рдФрд░ рд╕рднреА рдХреЛ рдмрдзрд╛рдИ! рдореИрдВ рдЖрдкрдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб, рднрд░реЛрд╕реЗрдордВрдж рд╕реЙрдХреЗрдЯ рдФрд░ рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ!
рдПрдХ рдХреЙрдиреНрд╕рд░реНрдЯ рдПрдЬреЗрдВрд╕реА рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рди рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХреБрдЫ рдЪрд░рдг рдореЗрдВ рдореБрдЭреЗ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рдгрд╛рд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рддрддреНрдХрд╛рд▓ рд╕реВрдЪрдирд╛рдПрдВ рдЖрдиреА рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреАрди рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:
- "рдЕрдВрддрд╣реАрди рдЖрдЗрдлреНрд░реЗрдо",
- XMLHttpRequest (рдЙрд░реНрдл рдЕрдЬрд╛рдХреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП,
- WebSocket рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдореИрдВ рддреБрд░рдВрдд рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди "рдЭрд╛рдбреВ" рдХрд░рддрд╛ рд╣реВрдВ (рдореИрдВ рдХрд╛рд░рдгреЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрд╛рддрд╛, рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореБрдЭреЗ рд╕рдордЭреЗрдВрдЧреЗ)ред
рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:
- рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣рд░ рд╕реЗрдХрдВрдб рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ:
- рд╕рд░реНрд╡рд░
- рдУрдПрд╕ рдЬрд┐рд╕ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ;
- рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдлрд┐рд░ рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд▓рдЧрд╛рддрд╛рд░ рдирд╡реАрдирддрдо рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдСрдирд▓рд╛рдЗрди рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рддреНрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рддреАрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдбреЙрдХреНрдЯрд░ рдиреЗ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдерд╛ред
рддреЛ, WebSocketред
WebSocket рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмреАрдЪ, рдХреЗрд╡рд▓ рдпрд╣ рддрдереНрдп рдХрд┐ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рд╡реЗрдмрдХрд┐рдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реА рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рд╡реЗ Google Chrome рдФрд░ Apple Safari рд╣реИрдВ) рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
рдЖрдЗрдП рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдлреБрд▓-рдбреБрдкреНрд▓реЗрдХреНрд╕ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХреА рдореВрд▓ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪреИрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдл рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╡реЗрдм рдкреЙрдХреЗрдЯреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИ, рд╣рдордиреЗ рдЗрд╕ рдкрд░ рдЬреНрдпрд╛рджрд╛ рд╕рдордп рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред рд╣рдо рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред
var socket = new WebSocket("ws://myserver.com:8081/"); socket.onopen = function () { console.log(" "); }; socket.onclose = function () { console.log (" "); }; socket.onmessage = function (event) { console.log (" :", event.data); };
рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬреЗрдВ () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:
socket.send(messageString);
рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рджрд┐рдЦрддрд╛ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЖрдк рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдореЗрд░реЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рдереЗ:
рдЗрдирдореЗрдВ рд╕реЗ, JWebSocket рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ WebSocket рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдврд╛рдВрдЪрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рд╕рд░реНрд╡рд░ рднреА рд╣реИред JWebSocket рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЕрдм рд╣рдо J2EE: рдЬреЗрдЯреНрдЯреА рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рдЖрдЗрдП рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЖрд░реЗрдЦ рдкрд░ред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЛрд░реНрдЯ 8080 рдкрд░ рдЧреНрд▓рд╛рд╕рдлрд╝рд┐рд╢ рд╕рд░реНрд╡рд▓реЗрдЯ рдХрдВрдЯреЗрдирд░ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЧреНрд▓рд╛рд╕рдлрд╝рд┐рд╢ [1] рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдПрдХ рдЪреИрдЯ рдкреЗрдЬ [2] рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рд╡реЗрдмрд╕рд░реНрдХреЗрдЯ [3] рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЛрд░реНрдЯ 8081 рд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИред рдлрд┐рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдПрдХ рдкреВрд░реНрдг рджреНрд╡реИрдз рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рд╣реЛрддрд╛ рд╣реИ [4]ред
рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдЬреЗрдЯреНрдЯреА рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 8.0.1.v20110908 рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб, рдЕрдирдкреИрдХ (рдореИрдВ рдорд╛рд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ), рд╡рд┐рддрд░рдг рд╕реЗ рд╣рдо 6 рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
- рдШрд╛рдЯ-рдирд┐рд░рдВрддрд░рддрд╛-8.0.1.v20110908.jar,
- рдШрд╛рдЯ-http-8.0.1.v20110908.jar,
- рдШрд╛рдЯ-рдХрдм-8.0.1.v20110908.jar,
- рдШрд╛рдЯ-server-8.0.1.v20110908.jar,
- рдШрд╛рдЯ-util-8.0.1.v20110908.jar,
- рдШрд╛рдЯ-WebSocket-8.0.1.v20110908.jarред
рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдУрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдЗрд╕реЗ
рдпрд╣рд╛рдБ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб
рдХрд░реЗрдВ (рдореИрдВ HTML рдХреЛрдб рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдХреЗ рдкреЛрд╕реНрдЯ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛)ред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░ chat.html рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд┐рд╡рд░рдгрдХ (web.xml) рдореЗрдВ, "рдЦреЛрдЬ-рдлрд╛рдЗрд▓" рдХреЗ рд░реВрдк рдореЗрдВ chat.html рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
рдЕрдм рдереЛрдбрд╝рд╛ рдЬреЗрдЯреНрдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
Jetty рдПрдВрдмреЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╣реИред org.eclipse.jetty.server.Serverред рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХрд╛ рдкрддрд╛ рдпрд╛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреЛрд░реНрдЯ рдирдВрдмрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
Server jetty = new Server(8081);
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬреЗрдЯреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреЗрдЯреНрдЯреА рдХреНрд░рдорд╢рдГ рдкреНрд░рд╛рд░рдВрдн () рдФрд░ рд╕реНрдЯреЙрдк () рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдФрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рд╣реИрдВрдбрд▓рд░ рд╣рдореЗрдВ рдЕрдкрдирд╛ рд▓рд┐рдЦрдиреЗ, рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП WebSocket рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдореЗрдВ рдЗрд╕реЗ org.eclipse.jetty.websocket.WebSocketHandler рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
public class ChatWebSocketHandler extends WebSocketHandler {
тАж
}
WebSocketHandler рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕рд╛рд░ doWebSocketConnect () рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬреЗрдЯреА рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡реЗрдмрд╕рдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рд╣рдореЗрдВ рдЕрдкрдиреЗ WebSocket рдХреНрд▓рд╛рд╕ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдо рдЗрд╕реЗ org.eclipse.jetty.websocket.WebSocket.OnTextMessage рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗ- рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡реЗрдмрд╕рд░реНрдХреЗрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред Org.eclipse.jetty.websocket.WebSocket.OnTextMessage рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рддреАрди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- onOpen () - рдПрдХ рд╕реЙрдХреЗрдЯ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдмреБрд▓рд╛рдпрд╛;
- onClose () - рд╕реЙрдХреЗрдЯ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреБрд▓рд╛рдпрд╛;
- onMessage () - рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдЖрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рд░рд▓ рд▓рдЧ рд░рд╣рд╛ рд╣реИ! рдЪрд▓реЛ ChatWebSocketHandler рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import org.eclipse.jetty.websocket.WebSocket; import org.eclipse.jetty.websocket.WebSocketHandler; public class ChatWebSocketHandler extends WebSocketHandler { private final Set<ChatWebSocket> webSockets = new CopyOnWriteArraySet<ChatWebSocket>(); @Override public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо ChatWebSocketHandler рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ:
- 1 рд╕рдВрдкрддреНрддрд┐ - рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ;
- 1 рд╡рд┐рдзрд┐ рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреА рд╣реИ рдФрд░ рд▓реМрдЯрд╛рддреА рд╣реИ;
- 1 рдирд┐рдЬреА рд╡рд░реНрдЧ рдЬреЛ рдЗрд╕ WebSocket рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
ChatWebSocket рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо onMessage () рд╡рд┐рдзрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХреНрд╕рдЪреЗрдВрдЬ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреНрдпрд╛ рд╣реИ?
рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рднреА рдкрд╛рда рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреАрди рдЖрджреЗрд╢реЛрдВ рдХреЛ рдЙрдирд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- / рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдирд╛рдо // рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП
- / getUsers // рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП
- / рд╕рд╣рд╛рдпрддрд╛ // рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдирд┐рдореНрди рдкреИрдЯрд░реНрди рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:
- inf | рд╕реВрдЪрдирд╛ // рд╕реВрдЪрдирд╛ рдЖрдИ
- рдореЗрдВ | nic | рд╕рдВрджреЗрд╢ // рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдХ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрджреЗрд╢
- out | message // рдореЗрд░рд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ
- рддреНрд░реБрдЯрд┐ | рддреНрд░реБрдЯрд┐ // рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рдЖ рдЧрдИ рд╣реИ
рдмрд╛рдХреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рд╕рдм рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдг рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ - рдЬреЗрдЯреНрдЯреА рд╕рд░реНрд╡рд░ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ: рд╕рд░реНрд╡рд▓реЗрдЯ рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдЬреЗрдЯреНрдЯреА рдЪрд▓рд╛рдПрдВ; рд╕рд░реНрд╡рд▓реЗрдЯ рдХрдВрдЯреЗрдирд░ рдХреЛ рд░реЛрдХрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЬреЗрдЯреНрдЯреА рдмрдВрдж рдХрд░реЗрдВред GlassFish рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ ContextListener рд▓рд┐рдЦреЗрдВред рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВ? рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ javax.servlet.ServletContextListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВред рд╕реВрдЪреА рджреЗрдЦреЗрдВред
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.DefaultHandler; public class ChatServerServletContextListener implements ServletContextListener { private Server server = null; @Override public void contextInitialized(ServletContextEvent event) { try {
Javax.servlet.ServletContextListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕реНрд╡-рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдирд╛рдо рдХреЗ рд╕рд╛рде рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ: ReferenceInitialized (), ReferenceDestroyed ()ред
рдЕрдм рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ ContextListener рдХреЛ рддреИрдирд╛рддреА рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (web.xml) рдореЗрдВ рдкреНрд▓рдЧ рдХрд░ рджреЗрдВред рдореИрдВ рдЙрд╕рдХреА рд╕реВрдЪреА рджреВрдВрдЧрд╛:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>chat.html</welcome-file> </welcome-file-list> <listener> <listener-class>ChatServerServletContextListener</listener-class> </listener> </web-app>
рдЦреИрд░ рдЕрдм рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдПрдХ рд╕рд╛рде рджреЛ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рд▓рд┐рдкреНрдд рд░рд╣реЗрдВред рдХреГрдкрдпрд╛ рд╕рдордп рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рд╕рдВрджреЗрд╢ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдЖрддреЗ рд╣реИрдВред рдЕрдЬрд╛рдХреНрд╕ рдкрд░ рдРрд╕реА рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖
рдкреВрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ
рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИрдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреНрд▓рд╛рд╕рдлрд┐рд╢ 2.x, 3.x рдФрд░ рдЯреЙрдордХреИрдЯ 5.0 рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг Netbeans 7.0.1 рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдВрджрд░, рдЖрдк рдЪреАрдВрдЯреА рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреАрдВрдЯреА-рддреИрдирд╛рдд.рдПрдХреНрд╕рдПрдордПрд▓ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВ рдорд╛рд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдмреЗрддрд╣рд╛рд╢рд╛ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВред
рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдЬреЛ рд╡реЗрдмрд╕реНрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рдиред
рддреАрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЬреЗрдЯреНрдЯреА рд╕рд░реНрд╡рд░ рдкрд░ ddos тАЛтАЛрд╣рдорд▓реЛрдВ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрд╛ рдЬрд╛рдПред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╕рднреА рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдПрдХ рдЦреБрд╢ рдЫреБрдЯреНрдЯреА!