.Net core下的Websocket

很多情况下BS架构也会有客户端和服务器进行长连接的功能需求,比如说聊天、或者说弹幕功能。

而WebSocket是一种在单个TCP连接上进行全双工通信的协议,所以这个时候就使用到了websocket。

首先我们需要先写一个简单的客户端网页:

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
     <hr>
     <input id="sendMsg" /> <button onclick="sendMessage();">消息发送</button>
</body>
<script>
    var ws = new WebSocket('ws://localhost:50728/api/websocket');
 
    // 建立 web socket 连接成功触发事件
    ws.onopen = function () {
        var json={serverId:['11231','24423']}
        var messageJson = JSON.stringify(json);
         ws.send(messageJson);//可以给后台发送参数
    };
    function sendMessage()
    {
     var sendmsg = document.getElementById("sendMsg").value;
     ws.send(sendmsg);
    }
    //接收到消息的回调方法
    ws.onmessage = function (event) {
        alert('数据回来了额'+ JSON.stringify(event.data))
        console.log(event.data);//后台不间断发送数据,持续接收。
    }
 
    //断开 web socket 连接成功触发事件
    ws.onclose = function () {
        alert("连接已关闭...");
    };
    ws.onerror = function(event)
    {
    console.log(event.data);
    }
</script>
</html>

比较简单的一个测试网页,那么接下来我们.net core 是如何编写代码的吧:

首先我们先添加中间件:

         app.UseWebSockets(new WebSocketOptions
            {
                KeepAliveInterval = new TimeSpan(0, 0, 15)
            });

这里的KeepAliveInterval 的意思是心跳检测的时间,这里是15s检测一次,确保websocket不会断开。

第二步就是编写代码了,别忘了 using System.Net.WebSockets;以及route应该是ws开头的:

        /// <summary>
        /// websocket连接
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task WebScoketConn()
        {
            var context = ControllerContext.HttpContext;

            //是否是websocket请求
            if (context.WebSockets.IsWebSocketRequest)
            {
                var websocket = await context.WebSockets.AcceptWebSocketAsync();

                while (!websocket.CloseStatus.HasValue)
                {
                    try
                    {
                        //判断连接是否打开
                        if (websocket.State == WebSocketState.Open)
                        {
                            byte[] recvBuffer = new byte[4096];
                            var recvAs = new ArraySegment<byte>(recvBuffer);
                            var result = await websocket.ReceiveAsync(recvAs, CancellationToken.None);

                            if (result.Count > 0 && result.MessageType == WebSocketMessageType.Text)
                            {
                                if (result.EndOfMessage)
                                {
                                    if (Encoding.UTF8.GetString(recvBuffer, 0, result.Count) != "hello")
                                    {
                                       await websocket.SendAsync(new ArraySegment<byte>(recvBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
                                    }
                                }
                                
                            }
                        }
                        else if (websocket.State == WebSocketState.Aborted || websocket.State == WebSocketState.Closed || websocket.State == WebSocketState.CloseReceived || websocket.State == WebSocketState.CloseSent)
                        {
                            _logger.LogWarning($"WebSocket closed");
                            break;
                        }
                    }
                    catch (Exception e)
                    {
                        _logger.LogError(e, $"Receive heartbeat failed");
                    }

                    Thread.Sleep(1000);
                }

            }
            else
            {
                context.Response.StatusCode = 400;
            }
        }

然后我们启动网页可以发现已经连接上了,然后服务器会返回一开始发送的数据消息,

这就是比较简单的websocket的使用方法,之后会用怎么用websocket实现类似于qq的聊天功能。还有配合消息队列实现弹幕功能等。

猜你喜欢

转载自www.cnblogs.com/Ivan-Wu/p/12365811.html