From cb305792d0d9b920c3d47f0667d3a48180019e37 Mon Sep 17 00:00:00 2001 From: DTieman Date: Mon, 13 Mar 2023 11:44:34 +0100 Subject: [PATCH] Basic websocket setup --- .gitignore | 5 +++ Controllers/WebSocketsController.cs | 53 +++++++++++++++++++++++++++++ MauMau-Server.csproj | 16 +++++++++ Program.cs | 29 ++++++++++++++++ README.md | 1 + appsettings.Development.json | 8 +++++ appsettings.json | 9 +++++ 7 files changed, 121 insertions(+) create mode 100644 .gitignore create mode 100644 Controllers/WebSocketsController.cs create mode 100644 MauMau-Server.csproj create mode 100644 Program.cs create mode 100644 README.md create mode 100644 appsettings.Development.json create mode 100644 appsettings.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..77c1c5f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +bin +obj +Properties +appsettings.Local.json diff --git a/Controllers/WebSocketsController.cs b/Controllers/WebSocketsController.cs new file mode 100644 index 0000000..2f4944e --- /dev/null +++ b/Controllers/WebSocketsController.cs @@ -0,0 +1,53 @@ +using System.Net.WebSockets; +using System.Text; +using Microsoft.AspNetCore.Mvc; + +namespace MauMau_Server.Controllers; + +[ApiController] +[Route("[controller]")] +public class WebSocketsController : ControllerBase +{ + private readonly ILogger _logger; + + public WebSocketsController(ILogger logger) + { + _logger = logger; + } + + [HttpGet("/ws")] + public async Task Get() + { + if (HttpContext.WebSockets.IsWebSocketRequest) + { + using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); + _logger.Log(LogLevel.Information, "WebSocket connection established"); + await Echo(webSocket); + } + else + { + HttpContext.Response.StatusCode = 400; + } + } + + private async Task Echo(WebSocket webSocket) + { + var buffer = new byte[1024 * 4]; + var result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); + _logger.Log(LogLevel.Information, "Message received from Client"); + + while (!result.CloseStatus.HasValue) + { + var serverMsg = Encoding.UTF8.GetBytes($"Server: Hello. You said: {Encoding.UTF8.GetString(buffer)}"); + await webSocket.SendAsync(new ArraySegment(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None); + _logger.Log(LogLevel.Information, "Message sent to Client"); + + buffer = new byte[1024 * 4]; + result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); + _logger.Log(LogLevel.Information, "Message received from Client"); + + } + await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + _logger.Log(LogLevel.Information, "WebSocket connection closed"); + } +} \ No newline at end of file diff --git a/MauMau-Server.csproj b/MauMau-Server.csproj new file mode 100644 index 0000000..3a79e42 --- /dev/null +++ b/MauMau-Server.csproj @@ -0,0 +1,16 @@ + + + + net7.0 + enable + enable + MauMau_Server + + + + + + + + + diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..1230db5 --- /dev/null +++ b/Program.cs @@ -0,0 +1,29 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +var services = builder.Services; +services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +services.AddEndpointsApiExplorer(); +services.AddSwaggerGen(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +var webSocketOptions = new WebSocketOptions() +{ + KeepAliveInterval = TimeSpan.FromSeconds(120), +}; + +app.UseWebSockets(webSocketOptions); + +app.UseHttpsRedirection(); +app.UseAuthorization(); +app.MapControllers(); +app.Run(); \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5dfe9d7 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Mau \ No newline at end of file diff --git a/appsettings.Development.json b/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/appsettings.json b/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +}