.net5 WebAPI中搭建WebSocket服务端

18 篇文章 3 订阅

背景:需要开发一个WebSocket服务端,用来向h5客户端推送消息;以前的做法是直接做一个windows服务,专门开一个端口来进行WebSocket连接,现在可以在.net5 WebAPI中直接支持WebSocket,且不用单开端口

使用步骤:

1.在Startup.cs的Configure中启用WebSocket中间件

 app.UseWebSockets();

2.在控制器中添加Action,来接收WebSocket客户端的连接和处理接收、发送消息,关闭连接;

      [HttpGet("/ws")]
        public async Task Get()
        {
            if (HttpContext.WebSockets.IsWebSocketRequest)
            {
                //接受websocket客户端连接
                using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
                await Echo(webSocket);
            }
            else
            {
                //不是websocket客户端请求
                HttpContext.Response.StatusCode = 400;//
            }
        }
        /// <summary>
        /// 对客户端的处理,接受消息,发送消息,关闭连接
        /// </summary>
        /// <param name="webSocket"></param>
        /// <returns></returns>
        private async Task Echo(WebSocket webSocket)
        {
            var buffer = new byte[1024 * 4];
            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

            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);
                //继续接受客户端消息
                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            }
            //关闭释放与客户端连接
            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }

3.具体可以按照自己的业务来做,比如存储一个客户端字典来维护,指定客户端进行发送消息。

4.H5上操作就是这样:

let ws = new WebSocket('ws://api.zhandian.com/ws');//连接的就是api网站的地址
ws.onmessage = function (e) {
                //监听消息
                console.log(e);
                console.log(e.data);
            };

当然我现在websocket客户端不多,还不知道客户端多的话,这样会不会影响api接口,等待验证

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值