.net使用webSocket

在Program.cs中添加

var webSocketOptions = new WebSocketOptions
{
    KeepAliveInterval = TimeSpan.FromMinutes(2)
};
app.UseWebSockets(webSocketOptions);

.net使用webSocket_第1张图片

创建一个api接口

[Route("api/[controller]")]
[ApiController]
public class LogController : ControllerBase
{
    private static ConcurrentBag _sockets = new ConcurrentBag();
    private readonly ILogger _logger;


    public LogController(ILogger logger)
    {
        _logger = logger;
    }
    // 前端ws连接的接口(这个接口是必须是get请求)
    [HttpGet]
    public async Task Get()
    {
        if (HttpContext.WebSockets.IsWebSocketRequest)
        {
            WebSocket webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
            _sockets.Add(webSocket);
            await Receive(webSocket, async (result, buffer) =>
            {
                if (result.MessageType == WebSocketMessageType.Text)
                {
                    Console.WriteLine("Message received");
                }
                else if (result.MessageType == WebSocketMessageType.Close)
                {
                    _sockets.TryTake(out WebSocket _);
                    await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
                }
            });
        }
        else
        {
            HttpContext.Response.StatusCode = 400;
        }
    }

    private async Task Receive(WebSocket socket, Action handleMessage)
    {
        var buffer = new byte[1024 * 4];
        while (socket.State == WebSocketState.Open)
        {
            var result = await socket.ReceiveAsync(buffer: new ArraySegment(buffer), cancellationToken: CancellationToken.None);
            handleMessage(result, buffer);
        }
    }
    // 广播发送
    public static async Task BroadcastLog(string log)
    {
        var buffer = Encoding.UTF8.GetBytes(log);
        foreach (var socket in _sockets)
        {
            if (socket.State == WebSocketState.Open)
            {
                await socket.SendAsync(new ArraySegment(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
            }
        }
    }
}

在vue中的例子






你可能感兴趣的:(asp.net,websocket)