示例#1
0
        private async Task Echo(HttpContext context, WebSocket webSocket)
        {
            // Task.Run(() => Loop(context, webSocket));

            var buffer = new byte[1024 * 4];
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

            while (!result.CloseStatus.HasValue)
            {
                Console.WriteLine("Received");
                var resultString = Encoding.UTF8.GetString(buffer, 0, result.Count);
                Console.WriteLine(resultString);

                var resultJson = JsonConvert.DeserializeObject <Dictionary <string, string> >(resultString);
                var name       = resultJson["name"];
                if (resultJson.ContainsKey("play"))
                {
                    // User plays
                    SocketWatcher.Play(webSocket, resultJson["play"]);
                    await SocketWatcher.SendResultsAll();
                }

                await SocketWatcher.SendMessageAll(result, buffer);

                // Keep reading
                result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);
            }
            Console.WriteLine("Socket closing!");
            SocketWatcher.Delete(webSocket);
            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }
示例#2
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

#if NoOptions
            app.UseWebSockets();
#endif

#if UseOptions
            var webSocketOptions = new WebSocketOptions()
            {
                KeepAliveInterval = TimeSpan.FromSeconds(120),
                ReceiveBufferSize = 4 * 1024
            };
            app.UseWebSockets(webSocketOptions);
#endif

            app.UseCors(builder => builder
                        .AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        // .AllowCredentials()
                        );

            app.UseRouting();

            app.UseFileServer();

            Task.Run(() => SocketWatcher.Run());

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/status", async(context) =>
                {
                    await context.Response.WriteAsync(SocketWatcher.ListAll());
                });

                endpoints.MapGet("/ws/{name}", async(context) =>
                {
                    if (context.WebSockets.IsWebSocketRequest)
                    {
                        WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
                        var name            = context.GetRouteValue("name");
                        SocketWatcher.Add(webSocket, name.ToString());
                        await Echo(context, webSocket);
                    }
                    else
                    {
                        context.Response.StatusCode = 400;
                    }
                });
            });
        }