c# - 如何在 asp.net core 中使用 websockets

标签 c# asp.net-core websocket server client

我试图开发一个游戏,我将记分牌存储在一个文本文件中,该文件存储在服务器上(当前在本地主机上)。我正在使用 http get 和 post 调用来与服务器通信并获取和发送我想要的数据。现在我想实现 websockets 以便将通知从服务器发送到 c# 客户端。通知只会在控制台上为用户显示一条消息,例如在 mu 情况下,我想在每次将用户添加到记分牌时,每次调用 UpdateScoreBoard 方法时向用户显示一条消息。根据我在网上找到的教程,我设法构建了以下代码,谁能让我更清楚我将如何为服务器构建 websocket 以及如何在客户端初始化 websocket?谢谢
Startup.cs(服务器)

        public void Configure(IApplicationBuilder app, IHostEnvironment env)
        {
          //deleted code

            var webSocketOptions = new WebSocketOptions()
            {
                KeepAliveInterval = TimeSpan.FromSeconds(120),
                ReceiveBufferSize = 4 * 1024
            };


            app.UseWebSockets(webSocketOptions);
        
            app.Use(async (context, next) =>
            {
                if (context.Request.Path == "/ws")
                {
                    if (context.WebSockets.IsWebSocketRequest)
                    {
                        WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
                        await Echo(context, webSocket);
                    }
                    else
                    {
                        context.Response.StatusCode = 400;
                    }
                }
                else
                {
                    await next();
                }

            });
        }

        private async Task Echo(HttpContext context, WebSocket webSocket)
        {
            var buffer = new byte[1024 * 4];
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            while (!result.CloseStatus.HasValue)
            {
                await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);

                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            }
            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }
HttpClass.cs (Client) - 我在这里调用 http post 请求
public async override Task<List<Scoreboard>> UpdateScoreBoards(string username, int attempts, int seconds, DateTime date)
            {
                HttpResponseMessage response = null;
                //Creating a new instance of object Scoreboard
                //deleted code

                var url = "http://localhost:5000/api/Scoreboard";

                var socket_url = new Uri("ws://localhost:5000"); 
                var exitEvent = new ManualResetEvent(false);
                using (var client = new WebsocketClient(socket_url))
                {
                    client.ReconnectTimeout = TimeSpan.FromSeconds(30);
                    client.ReconnectionHappened.Subscribe(info =>
                        Log.Information($"Reconnection happened, type: {info.Type}"));

                    client.MessageReceived.Subscribe(msg => Log.Information($"Message received: {msg}"));
                    await client.Start();

                    await Task.Run(() => client.Send("test"));

                    exitEvent.WaitOne();
                }

// deleted code
            }

最佳答案

can anyone make it more clear for me how the i will build the websocket for the server and how i will initialize the websocket on the client?


如您引用的示例所示,在 ASP.NET Core 中使用 WebSocket,我们可以添加 WebSockets middlewareConfigure方法,然后添加/配置请求委托(delegate)以检查和处理传入的 WebSocket 请求。
在将请求转换为带有 AcceptWebSocketAsync() 的 WebSocket 连接之后方法,我们可以使用返回的 WebSocket 对象来发送和接收消息。
Echo方法,我们还可以执行自定义代码逻辑,以根据收到的消息生成和发送回复消息/通知。
//received message
var mes = Encoding.UTF8.GetString(buffer, 0, result.Count);

//code logic here
//...

//create reply message
var reply_mes = $"You sent {mes}.";

byte[] reply_mes_buffer = Encoding.UTF8.GetBytes(reply_mes);

await webSocket.SendAsync(new ArraySegment<byte>(reply_mes_buffer, 0, reply_mes.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
此外,ASP.NET Core SignalR 是一个开源库,可简化实时通信功能的实现。它确实支持 WebSockets 传输,我们可以轻松地将消息/通知推送到所有连接的客户端或连接的客户端的指定子集。
有关 ASP.NET Core SignalR 的更多信息,您可以查看此文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/websockets?view=aspnetcore-3.1

关于c# - 如何在 asp.net core 中使用 websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62756874/

相关文章:

c# - 使用 ASP.NET Core API 调用的 postman 请求未经授权

docker 中的 nginx + websocket 代理 + Ratchet

c# - 错误 WebHostBuilder 只允许创建 WebHost 的单个实例

python web-socket 客户端此日志记录来自哪里?

linux - 将 linux 命令输出到 url/port 或 scocket 而不是将其写入文件

c# - Silverlight/C# web 应用程序 - 无需打开即可将 PDF 发送到客户的打印机

c# - WaitingForActivation 而不是 key 保管库 secret 值(在 Azure 中),为什么?

c# - 计算无符号长序列中的公共(public)位

c# - SignalR,如何验证连接 ID 是否仍处于事件状态?

c# - 根据Route在Controller中注入(inject)不同的实现