剑峰的茅草屋

剑峰的茅草屋
程序猿的掉发日常
  1. 首页
  2. .Net
  3. 正文

.Net API webSocket 模板

2021 年 11 月 22 日 161点热度 0条评论

.Net FrameWork 

private static List<WebSocket> _sockets = new List<WebSocket>();

        [Route("Connect")]
        [HttpGet]
        [AllowAnonymous]
        public HttpResponseMessage Connect()
        {
            HttpContext.Current.AcceptWebSocketRequest(ProcessRequest); //在服务器端接受Web Socket请求,传入的函数作为Web Socket的处理函数,待Web Socket建立后该函数会被调用,在该函数中可以对Web Socket进行消息收发

            return Request.CreateResponse(HttpStatusCode.SwitchingProtocols); //构造同意切换至Web Socket的Response.
        }

        public async Task ProcessRequest(AspNetWebSocketContext context)
        {
            var socket = context.WebSocket;//传入的context中有当前的web socket对象
            _sockets.Add(socket);//此处将web socket对象加入一个静态列表中

            //进入一个无限循环,当web socket close是循环结束
            while (true)
            {
                var buffer = new ArraySegment<byte>(new byte[1024]);
                var receivedResult = await socket.ReceiveAsync(buffer, CancellationToken.None);//对web socket进行异步接收数据
                if (receivedResult.MessageType == WebSocketMessageType.Close)
                {
                    await socket.CloseAsync(WebSocketCloseStatus.Empty, string.Empty, CancellationToken.None);//如果client发起close请求,对client进行ack
                    _sockets.Remove(socket);
                    break;
                }

                if (socket.State == System.Net.WebSockets.WebSocketState.Open)
                {
                    string recvMsg = Encoding.UTF8.GetString(buffer.Array, 0, receivedResult.Count);
                    var recvBytes = Encoding.UTF8.GetBytes(recvMsg);
                    var sendBuffer = new ArraySegment<byte>(buffer.Array);
                    foreach (var innerSocket in _sockets)//当接收到文本消息时,对当前服务器上所有web socket连接进行广播
                    {
                        if (innerSocket != socket)
                        {
                            await innerSocket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
                        }
                    }
                }
            }
        }

 

 

.Net Core

Startup.cs

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   //添加WebSocket支持,SignalR优先使用WebSocket传输
    app.UseWebSockets(webSocketOptions);
  
   app.Use(async (context, next) =>
          {
              if (context.Request.Path == "/ws1")
              {
                  if (context.WebSockets.IsWebSocketRequest)
                  {
                      //非压缩
                      using (WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync())
                      {
                          await Echo(context, webSocket);
                      }

                      //压缩信息
                      //using (WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(
                      //new WebSocketAcceptContext() { DangerousEnableCompression = true }))
                      // {
                      //   await Echo(context, webSocket);
                      // }
                      //}
                  }
                  else
                  {
                      context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                  }
              }
              else
              {
                  await next();
              }

          });
}
public void ConfigureServices(IServiceCollection services)
{



    //注入SignalR实时通讯,默认用json传输
    services.AddSignalR(options =>
    {
        //客户端发保持连接请求到服务端最长间隔,默认30秒,改成4分钟,网页需跟着设置connection.keepAliveIntervalInMilliseconds = 12e4;即2分钟
        options.ClientTimeoutInterval = TimeSpan.FromMinutes(4);
        //服务端发保持连接请求到客户端间隔,默认15秒,改成2分钟,网页需跟着设置connection.serverTimeoutInMilliseconds = 24e4;即4分钟
        options.KeepAliveInterval = TimeSpan.FromMinutes(2);
    });



}

消息处理中间方法

    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)
        {
            if (result.MessageType == WebSocketMessageType.Text)
            {
                //获取文本
                string str = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
                //传递文本
                byte[] byteArray = System.Text.Encoding.Default.GetBytes("我收到了消息:"+str);
                await webSocket.SendAsync(new ArraySegment<byte>(byteArray, 0, byteArray.Length), 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);
    }
}

 

 

标签: 暂无
最后更新:2021 年 11 月 22 日

sunjianfeng

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2024 剑峰的茅草屋. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

沪ICP备2021017081号