求助后端大佬c# .net core WebSocket

WebSocket小白,求助大佬,我想做一个跟服务器长连接的登录。
比如第一个用户登录了这个账号就把他记录在字典表里,如果有第二个人也登录了这个账号就给第一个账号发消息,说账号已在其他地方登录,然后关闭第一个人的连接,再跟第二个人连接。userId是客户端传过去的。

运行到 HandleWebSocket 里的

WebSocketReceiveResult result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
这句话就会一直等待消息,可是如果不执行这句话,发送消息的时候就会报错:远程参与方在未完成关闭握手的情况下关闭了WebSocket连接。

求助大佬,帮帮小白


下面贴代码

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Concurrent;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CakePrintWeb2.WebSocketTest;

public class WebSocketMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ConcurrentDictionary<string, WebSocket> _sockets;

    public WebSocketMiddleware(RequestDelegate next)
    {
        _next = next;
        _sockets = new ConcurrentDictionary<string, WebSocket>();
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.Path == "/ws")
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket socket = await context.WebSockets.AcceptWebSocketAsync();
                string userId = context.Request.Query["userId"];
                
                _sockets.AddOrUpdate(userId, socket, (key, oldSocket) => socket);
                await HandleWebSocket(socket, userId);
            }
            else
            {
                context.Response.StatusCode = 400;
            }
        }
        else
        {
            await _next(context);
        }
    }

    private async Task HandleWebSocket(WebSocket socket, string userId)
    {
    
        byte[] buffer = new byte[1024 * 4];
        WebSocketReceiveResult result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

        while (!result.CloseStatus.HasValue)
        {
            // Handle received message

            result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        }

        await SendToUser(_sockets[userId], "Your account has been logged in from another location. This connection will be closed.");

        _sockets.TryRemove(userId, out _);
        await socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
    }
    
    private async Task SendToUser(WebSocket socket, string message)
    {
        var buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(message));
        await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
    }
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Core是微软推出的跨平台开发框架,它支持使用C#等语言进行开发。WebSocket是一种在Web应用程序中实现实时通信的协议。在.NET Core中,可以利用WebSocket类来实现WebSocket通信。下面是一个简单的.NET Core WebSocket类示例: 首先,在Startup.cs中配置WebSocket中间件: ```C# public void ConfigureServices(IServiceCollection services) { // 省略其他配置 services.AddWebSocketManager(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 省略其他配置 app.UseWebSockets(); app.MapWebSocketManager("/ws", app.ApplicationServices.GetService<ChatRoomManager>()); } ``` 然后,创建一个WebSocket处理程序: ```C# public class WebSocketHandler { private readonly WebSocketManager _webSocketManager; public WebSocketHandler(WebSocketManager webSocketManager) { _webSocketManager = webSocketManager; } public async Task Handle(WebSocket socket) { // 处理WebSocket连接 } } ``` 接着,在WebSocket管理器中管理WebSocket连接: ```C# public class WebSocketManager { private readonly ConcurrentDictionary<string, WebSocket> _sockets = new ConcurrentDictionary<string, WebSocket>(); public WebSocket GetSocketById(string id) { // 根据id获取WebSocket连接 } public IEnumerable<WebSocket> GetSockets() { // 获取所有WebSocket连接 } } ``` 最后,在Controller中处理WebSocket请求: ```C# public class WebSocketController : Controller { private readonly WebSocketManager _webSocketManager; public WebSocketController(WebSocketManager webSocketManager) { _webSocketManager = webSocketManager; } [HttpGet("/ws")] public async Task Get() { // 处理WebSocket请求 } } ``` 通过以上示例,可以看到在.NET Core中使用WebSocket类实现了WebSocket通信的基本操作,包括配置中间件、创建处理程序、管理连接和处理请求等。这样就可以在.NET Core应用程序中方便地实现WebSocket实时通信了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值