рдПрдХрд▓ .NET рдЧреЗрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рднрд╛рдЧ рджреЛ, рдЕрдзрд┐рдХ рддрдХрдиреАрдХреА

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


1. рд╕рд╛рдорд╛рдиреНрдп

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдЗрд╕ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдЫрд╡рд┐

рдКрдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рддреАрди рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХрд╛ рдПрдХ рдЖрд░реЗрдЦ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

2. рд╕рд░реНрд╡рд░

рдореЗрд░рд╛ рд╕рд░реНрд╡рд░ MVC4 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рдПрдЬрд╝реНрдпреЛрд░ рдореЗрдВ "рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рдЪреБрдирд╛рд╡ рдХреНрдпреЛрдВ? рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ:
1) рдореБрдЭреЗ рдХреБрдЫ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред
2) рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдЧреЗрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╡реЗрдмрд╕рдХреЗрдЯ рд╣реИ, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ, рдЬреИрд╕реЗ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛, рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ / рдмрдЪрдд рдХрд░рдирд╛, рдФрд░ рдЕрдзрд┐рдХ - рд╡реЗрдмрдПрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ - рдЗрд╕рд▓рд┐рдП рдПрдорд╡реАрд╕реА рд╣реИред
3) рдореЗрд░реЗ рдкрд╛рд╕ Azure рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд╣реИред

рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрд░реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░ - рд╕рд░реНрд╡рд░ рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:
1) рд╕рд░реНрд╡рд░рдЧреЗрдо - рдкреВрд░реЗ рдЦреЗрд▓ рддрд░реНрдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди;
2) ServerClient - рдЦреЗрд▓ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ рдХреЗ рдмреАрдЪ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдордзреНрдпрд╕реНрде;
3) WSCommunicator - рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ - рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ / рднреЗрдЬрдирд╛ред

ServerGame рдФрд░ ServerClient рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЧреЗрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, ServerClient рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧреЗрдо рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╡рд╣ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ ( ServerGame ) рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ ( WSCommunicator рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддрд╛ рд╣реИ) рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕рд╛ рдХреЗ рдЦреЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рд╡рд┐рдВрдбреЛрдЬ 8 рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрдкрдиреА рдмрд╛рд░реА рдореЗрдВ рдХрдИ рдкрд╛рд╕рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд┐рдП (рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдЕрдЧрд▓реЗ рдореВрд▓реНрдп рдкрд░ рдЙрдирдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓рд╛)ред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХреА рдЧрдИ рдФрд░ ServerClient рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ ServerGame рд╡рд░реНрдЧ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдПред рдЗрд╕ рдЧреЗрдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдЕрдиреНрдп рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, WP рдФрд░ Android) рдХреЛ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрджрд▓реЗ рдореЗрдВ, рдпреВрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬреАред
рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ ServerGame рд╡рд░реНрдЧ рдореЗрдВ рд╣реА "рд╕рд░реНрд╡рд░" рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд .NET рдХреНрд▓рд╛рд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ ClientGame рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ ClientGame рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЧреЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреИрд╕реЗ рдореЗрд░реЗ "рдмреБрдХрд▓реЗрдЯ" рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЦреЗрд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЬрдм рдПрдХ рдпреВрдЖрдИ рдкреЗрдЬ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рджреЛрдиреЛрдВ рдЦреЗрд▓ рд╕рдВрднрд╡ рд╣реЛрддреЗ рд╣реИрдВред
WSCommunicator - рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд░реНрдЧред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рд╡реЗрдм рдкреЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред .NET 4.5 рдиреЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдореВрд▓ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╡рд░реНрдЧ рд╣реИ, WSCommunicator рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ / рдмрдВрдж рдХрд░рдиреЗ, рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ / рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдереЛрдбрд╝рд╛ рдХреЛрдбред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдПрдЪрдЯреАрдкреА рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рднреМрддрд┐рдХ рдкреГрд╖реНрда рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрд╣ WebConfig'e рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

тАж <system.webServer> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="app" path="app.ashx" verb="*" type="Sanet.Kniffel.Server.ClientRequestHandler" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer> тАж 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд░реНрд╡рд░ рдкрд░ рдкреГрд╖реНрда (рдЖрднрд╛рд╕реА) "app.ashx" рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп, рд╡рд░реНрдЧ "Sanet.Kniffel.Server.ClientRequestHandler" рд╕реЗ рдХреЛрдб рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдпрд╣ рдХреЛрдб рд╣реИ:

 public class ClientRequestHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.IsWebSocketRequest) //  WebSocket context.AcceptWebSocketRequest(new Func<AspNetWebSocketContext, Task>(MyWebSocket)); else //  Http context.Response.Output.Write("  ..."); } public async Task MyWebSocket(AspNetWebSocketContext context) { string playerId = context.QueryString["playerId"]; if (playerId == null) playerId = string.Empty; try { WebSocket socket = context.WebSocket; // ,   WSCommunicator'          ServerClientLobby clientLobby = null; if (!string.IsNullOrEmpty(playerId)) { //         if ( !ServerClientLobby.playerToServerClientLobbyMapping.TryGetValue(playerId, out clientLobby)) { //  -   clientLobby = new ServerClientLobby(ServerLobby, playerId); ServerClientLobby.playerToServerClientLobbyMapping.TryAdd(playerId, clientLobby); } } else { //       return; } //     clientLobby.WebSocket = socket; await clientLobby.Start(); } catch (Exception ex) { //-   ... } } } 


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред WSCommunicator.Start () рд╡рд┐рдзрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ "рд╕реНрдЯреИрдВрдбрдмрд╛рдп" рдХрдорд╛рдВрдб рд▓реЙрдиреНрдЪ рдХрд░рддреА рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ ():

  public async Task Start() { if (Interlocked.CompareExchange(ref isRunning, 1, 0) == 0) { await Run(); } } protected virtual async Task Run() { while (WebSocket != null && WebSocket.State == WebSocketState.Open) { try { string result = await Receive(); if (result == null) { return; } } catch (OperationCanceledException) //     { } catch (Exception e) { //-  //  CloseConnections(); // ,       OnReceiveCrashed(e); } } } 


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

3. рдЧреНрд░рд╛рд╣рдХ

3.1 WinRTред

рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреВрд░реНрдг .NET 4.5 рдкрд░ рдерд╛, рддреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрд╕реА WSCommunicator рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ рдорд╛рдореВрд▓реА рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рд╕рд╛рде - WebSocket рд╡рд░реНрдЧ рдХреЗ рдмрдЬрд╛рдп, ClientWebSocket рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ред рд▓реЗрдХрд┐рди WinRT рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ StreamWebSocket рдФрд░ MessageWebSocket рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╛рда рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:

 public async Task<bool> ConnectAsync(string id, bool isreconnect = false) { try { //    ,            //(,  ) MessageWebSocket webSocket = ClientWebSocket; //     if (!IsConnected) { //   (ws://myserver/app.ashx") var uri = ServerUri(); webSocket = new MessageWebSocket(); webSocket.Control.MessageType = SocketMessageType.Utf8; //  webSocket.MessageReceived += Receive; webSocket.Closed += webSocket_Closed; await webSocket.ConnectAsync(uri); ClientWebSocket = webSocket; //        if (Connected != null) Connected(); //,    return true; } return false; } catch (Exception e) { //-   return false; } } 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд░реНрд╡рд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ: WSCommunicator.Receive () рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, WSCommunicator.Send () - рднреЗрдЬрддрд╛ рд╣реИред GameClient рд╕рд░реНрд╡рд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

3.2 рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди, рдЬрд╝рд╛рдорд░реАрди рдФрд░ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ (рд╕рд╛рде рд╣реА .NET 2.0)

рдпреЗ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЖрдЙрдЯ рдСрдлрд╝ рдмреЙрдХреНрд╕ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ WebSocket4Net , рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЧрдП рдПрдХ рдХреЗ рд╕рд╛рде WSCommunicatar рдИ рдореЗрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рд╕ рдХреА рдЬрдЧрд╣, рд╣рдо рдЗрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯрдЕрдк рдХреЛрдб рдХреИрд╕реЗ рдмрджрд▓реЗрдЧрд╛:

 public async Task<bool> ConnectAsync(string id, bool isreconnect = false) { try { //    ,            //(,  ) WebSocket webSocket = ClientWebSocket; //     if (!IsConnected) { //   (ws://myserver/app.ashx") var uri = ServerUri(); webSocket = new WebSocket(uri.ToString()); //  webSocket.Error += webSocket_Error; webSocket.MessageReceived += Receive; webSocket.Closed += webSocket_Closed; //  ,  ""   var tcs = new TaskCompletionSource<bool>(); webSocket.Opened += (s, e) => { //        ClientWebSocket = webSocket; if (Connected != null) Connected(); //,    else tcs.SetResult(true); }; webSocket.Open(); return await tcs.Task; } return false; } catch (Exception ex) { //-   return false; } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдорддрднреЗрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд╣реАрдВ рд╣реИрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдЦреЛрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ .NET рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ async рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Microsoft .Bcl рдкреИрдХреЗрдЬ рдХреЛ рдбрд▓рд╛ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред

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

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

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


All Articles