• .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的聊天功能。还有配合消息队列实现弹幕功能等。

  • 相关阅读:
    Vim常用命令
    [转载] Java注解
    学习Zookeeper之第3章Zookeeper内部原理
    学习Zookeeper之第2章Zookeeper安装
    学习Zookeeper之第1章Zookeeper入门
    《Effective Java 2nd》第8章 通用程序设计
    《Effective Java 2nd》第7章 方法
    Log4j2报错ERROR StatusLogger Unrecognized format specifier
    比较三个数,求最大数字 ( 应用条件运算符:?)
    两个数字比较大小的方法 (分别应用if-else和条件运算符实现)
  • 原文地址:https://www.cnblogs.com/Ivan-Wu/p/12365811.html
Copyright © 2020-2023  润新知