53 lines
1.9 KiB
C#
53 lines
1.9 KiB
C#
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<WebSocketsController> _logger;
|
|
|
|
public WebSocketsController(ILogger<WebSocketsController> 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<byte>(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<byte>(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<byte>(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");
|
|
}
|
|
} |