.net 5 使用WebSocket

前台简单构造:

window.location.search.replace("?","") 获取页面传值zs或者ls
<html>
<head>
    <script type="text/javascript">
           const webSochet= new WebSocket('ws://localhost:47471/ws');

           var origin=window.location.search.replace("?","");

           webSochet.onopen=function(res)
           {
               webSochet.send(origin);
           }

           webSochet.onmessage=function(res)
           {
               console.log(res.data);
           }

           function add(){
               var msg=document.getElementById("msg").value;
               var to=document.getElementById("to").value;
               webSochet.send(`${msg}***${to}`);
           }
    </script>
</head>
<body>
    <textarea id="msg">

    </textarea>
    发给:<select id="to">
            <option>请选择</option>
            <option>zs</option>
            <option>ls</option>
    </select>
    <button onclick="add()">发送数据</button>
</body>
</html>

首先在中间件中使用  app.UseWebSockets();

            app.UseAuthorization();
    
            app.UseWebSockets();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });       

如何使用全局变量:在configService中注入

 private readonly Dictionary<string, WebSocket> dic;

        //readonly static Dictionary<string, WebSocket> dic = new Dictionary<string, WebSocket>();

        public WeatherForecastController(Dictionary<string, WebSocket> dic)
        {
            this.dic = dic;
        }

后台代码演示

 public class WeatherForecastController : ControllerBase
    {
        readonly static Dictionary<string, WebSocket> dic = new Dictionary<string, WebSocket>();

        [HttpGet("/ws")]
        public async Task Get()
        {
            if (HttpContext.WebSockets.IsWebSocketRequest)
            {
                //接受websocket客户端连接
                var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
                await Echo(webSocket, dic);
            }
            else
            {
                //不是websocket客户端请求
                HttpContext.Response.StatusCode = 400;
            }
        }
        /// <summary>
        /// 对客户端的处理,接受消息,发送消息,关闭连接
        /// </summary>
        /// <param name="webSocket"></param>
        /// <returns></returns>
        private async Task Echo(WebSocket webSocket, Dictionary<string, WebSocket> dic)
        {
            var buffer = new byte[1024 * 4];
            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            var user = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
            dic.Add(user, webSocket);
            while (!result.CloseStatus.HasValue)
            {
                var message = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                if (message.Contains("***"))
                {
                    var msgArr = message.Split("***");
                    var msgDate = msgArr[0];
                    var msgTo = msgArr[1];
                    if (dic.ContainsKey(msgTo))
                    {
                        var webSocketGit = dic[msgTo];
                        //向客户端发送消息
                        await webSocketGit.SendAsync(new ArraySegment<byte>(buffer, 0, buffer.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
                    }
                    else
                    {
                        throw new Exception("用户不存在");
                    }
                }
                else
                {
                    //向客户端发送消息
                    await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, buffer.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);
        }
    }

  

posted @ 2022-05-16 19:10  电器小君子  阅读(495)  评论(0)    收藏  举报