Google рдРрдк рдЗрдВрдЬрди рдФрд░ рдЬрд╛рд╡рд╛ рдкрд░ рдЯрд┐рдХ-рдЯреИрдХ-рдЯреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪреИрдирд▓ рдПрдкреАрдЖрдИ

рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд┐рдХ-рдЯреИрдХ-рдЯреЛ рдЦреЗрд▓ рдореЗрдВ рдЪреИрдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХрд╣рд╛рдиреА рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ: рдЪреИрдирд▓ рдПрдкреАрдЖрдИ рдЕрд╡рд▓реЛрдХрди (рдЬрд╛рд╡рд╛) ред


рдЪреИрдирд▓ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЗрдмрд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд▓реЗрдЦ рдерд╛ , рд▓реЗрдХрд┐рди рдЕрдЬрдЧрд░ рдФрд░ рдЪреИрдЯ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдЯрд┐рдХ рдЯреАрдПрд╕реА рдЯреЛ рдФрд░ рдЬрд╛рд╡рд╛ рдХрд╛ рдЦреЗрд▓ рд╣реЛрдЧрд╛ред рдЦреЗрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ рд╣реИ , рд╕реНрд░реЛрдд рдХрд╛ рд▓реЗрдЦрдХ рдореИрдВ рдирд╣реАрдВ рд╣реВрдВред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдВрдХ 3 рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рдХрд░реЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЪреИрдирд▓ рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ (рд╡реЗрдм тАЛтАЛрдкреЗрдЬ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдФрд░ Google рдРрдк рдЗрдВрдЬрди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрдзрд░, рдЬрд╛рдирдХрд╛рд░ рд▓реЛрдЧреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд┐рд▓рд╣рд╛рд▓ XMPP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рднреА WebSockets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдЯрд┐рдХ-рдЯреИрдХ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдмрд┐рдирд╛ рдорддрджрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЕрдкрдиреЗ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреА рдЪрд╛рд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдЧрд╛ред рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЪреИрдирд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдкрд░) рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

<script src='/_ah/channel/jsapi'></script> //  js-api // token -    var channel = new goog.appengine.Channel(token); //    js-  var handler = { 'onopen': onOpened, //   'onmessage': onMessage, //    'onerror': function() {}, 'onclose': function() {} }; var socket = channel.open(handler); 

рдЗрд╕ рдХреЛрдб рдореЗрдВ, рдЯреЛрдХрди рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ рдЯреЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд)ред рдЗрд╕ рдЧреЗрдо рдореЗрдВ, рдпрд╣ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рддреБрд░рдВрдд рд╣реЛрддрд╛ рд╣реИред рдЯреЛрдХрди рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ
 String token = ChannelServiceFactory.getChannelService().createChannel(" "); 
ред рдЯреЛрдХрди 2 рдШрдВрдЯреЗ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдпреВрдЬрд░ рдЖрдИрдбреА рд╕реЗ рдмрдирддрд╛ рд╣реИ (
 String userId = UserServiceFactory.getUserService().getCurrentUser().getUserId(); 
) рдФрд░ рдЧреЗрдо рдХреБрдВрдЬреА, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдо рддреБрд░рдВрдд рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЦреЗрд▓ рдХреБрдВрдЬреА рд╡рд╛рд▓реЗ рд▓рд┐рдВрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рдЖрдордВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред CreateChannel рдкреИрд░рд╛рдореАрдЯрд░ utf-8 ( рд╕рдорд╕реНрдпрд╛ 3 ) рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ 64 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд┐рдХреНрд╕ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ svn рд╕реНрд░реЛрдд рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдпрд╣ рдЙрджрд╛рд╣рд░рдг 3 рд╕рд░реНрд╡рд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред TicTacToeServlet рдЦреЗрд▓, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреИрдирд▓ рдФрд░ рд╡реЗрдм рдкреЗрдЬ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрдХрд░ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред OpenedServlet рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рддрд░рдл рдПрдХ рдЪреИрдирд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЧреЗрдо рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЦреЗрд▓ рдпрд╛ рддреЛ рдЕрднреА рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЧреНрд░рд╛рд╣рдХ рдЦреЗрд▓ рдХреЗ рджреМрд░рд╛рди рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред MoveServlet рдЕрдкрдиреА рдЪрд╛рд▓ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЧреЗрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЬрд┐рд╕рдореЗрдВ рдЪреИрдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рднреЗрдЬрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЪреИрдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрдиреЛрдВ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рднреА рд░реБрдЪрд┐ рдЦреЗрд▓ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЗрдбреАрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рд╢рд╛рдпрдж рдЦреЗрд▓реЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрдореНрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдФрд░ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреИрдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдХрдиреЗрдХреНрд╢рди / рд╡рд┐рдпреЛрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, appengine-web.xml рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 <inbound-services> <service>channel_presence</service> </inbound-services> 

рдлрд┐рд░ рдЧреНрд░рд╛рд╣рдХ рдХреНрд░рдорд╢рдГ / _ah / рдЪреИрдирд▓ / рдХрдиреЗрдХреНрдЯреЗрдб / рдФрд░ / _ah / рдЪреИрдирд▓ / рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ / рдЬрдм рдХрдиреЗрдХреНрдЯ рдФрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдкрд░ POST рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рджрд╕реНрддрдХ рджреЗрдВрдЧреЗред рдЖрдк рд╕рд░реНрд╡рд░ рдХреА рдУрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 ChannelServiceFactory.getChannelService(); ChannelPresence presence = channelService.parsePresence(req); String id = presence.clientId(); boolean connected = presence.isConnected(); 

рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдХреЗ рдФрд░ рдЬреБрдбрд╝реЗ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╡рд┐рд░реЛрдзрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЯреЛрдХрди - рдЪреИрдирд▓ рдХреБрдВрдЬреА рдХреЛ рдЕрдзрд┐рдорд╛рдирддрдГ рдЧреБрдкреНрдд рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред 2 рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдСрдирд░реЛрд░ (), рдСрдирдХреНрд▓реЛрдЬ () рд╣реИрдВрдбрд▓рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдЪреИрдирд▓ рдирд┐рд░реНрдорд╛рдг рдХреЛрдб рджреЗрдЦреЗрдВ)ред

рдЗрд╕ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ minuses рдореЗрдВ рд╕реЗ, рдпрд╣ рдПрдХреАрдХреГрдд рдкреНрд░рд╕рд╛рд░рдг рдХреА рдХрдореА рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрд╛рдиреА рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЪреИрдЯ рд╕реНрд╡рдпрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝реАрдб рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ред рдПрд╕рдбреАрдХреЗ рд╕рдВрд╕реНрдХрд░рдг 1.7 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЬреЛрдбрд╝рдирд╛ рдерд╛
 <threadsafe>true</threadsafe> 
appengine-web.xml рдореЗрдВред
рдпрд╣ рдЪреИрдирд▓ рдПрдкреАрдЖрдИ: рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓: рдХреЛрдб рд▓реИрдм рдПрдХреНрд╕рд░рд╕рд╛рдЗрдЬ 4: рдЪреИрдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Google рдРрдк рдЗрдВрдЬрди / рдЬрд╛рд╡рд╛ рдкрд░ рдЪреИрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рднреА рдмрддрд╛рддрд╛ рд╣реИ ред

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


All Articles