首页 > 其他分享 >donet framework 4.8 WebApi 集成 websocket 的测试

donet framework 4.8 WebApi 集成 websocket 的测试

时间:2022-09-21 15:57:07浏览次数:83  
标签:WebApi donet websocket socket System innerSocket ws var using

后端:C# .net framework 4.8 WebApi  

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.WebSockets;


public class WebSocketsController : ApiController {

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

    [HttpGet, Route("ws")]
    public HttpResponseMessage GetWs() {
        if (HttpContext.Current.IsWebSocketRequest)
            HttpContext.Current.AcceptWebSocketRequest(ProcessRequest);
        return Request.CreateResponse(HttpStatusCode.SwitchingProtocols); //初次连接切换http协议到websocket
    }

    //服务端推送消息测试
    int i = 0;
    [HttpGet, Route("ServerSendTest")]
    public async Task ServerSendTestAsync() {
        while (i < 999) {
            i++;
            foreach (var innerSocket in _sockets) {
                if (innerSocket.State == WebSocketState.Open) {
                    var recvBytes = Encoding.UTF8.GetBytes($" | {DateTime.Now:yyyy-MM-ddTHH:mm:ss.fff}  | "); ;
                    var sendBuffer = new ArraySegment<byte>(recvBytes);
                    await innerSocket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
                }
            }
            await Task.Delay(1000);
        }
    }

    //接收客户端消息并处理
    private async Task ProcessRequest(AspNetWebSocketContext context) {
        try {
            var socket = context.WebSocket;//传入的context中有当前的web socket对象
            _sockets.Add(socket);//此处将web socket对象加入一个静态列表中                
            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 + $" OK | {DateTime.Now:yyyy-MM-ddTHH:mm:ss.fff}"); ;
                    var sendBuffer = new ArraySegment<byte>(recvBytes);
                    foreach (var innerSocket in _sockets) {
                        //当接收到文本消息时,对当前服务器上所有web socket连接进行广播
                        if (innerSocket != socket) {
                            await innerSocket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
                        }
                    }
                }
            }
        } catch {

        }
    }
}

前端测试:MS-edge , JS

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.6.0.min.js"></script>
    <style type="text/css">
        table {
            padding: 0;
            margin: 0;
            border-collapse: collapse;
        }

        td {
            border: 1px solid #009999;
            padding: 6px 6px 6px 12px;
            color: #4f6b72;
            text-align: center;
        }

        input {
            font-size: 15pt;
        }
    </style>
    <script type="text/javascript">
        function websocket() {
            var ws = new WebSocket("ws://localhost:54924/ws");
            ws.onopen = function () {
                console.log("open");
                ws.send("hello");
            };
            ws.onmessage = function (evt) {
                console.log(evt.data);
                $("#thtil").text(evt.data);
            };
            ws.onclose = function (evt) {
                console.log("WebSocketClosed!");
            };
            ws.onerror = function (evt) {
                console.log("WebSocketError!");
            };
        }
    </script>
</head>
<body>
    <span style="font-size:30pt">WebSocket Test</span><p />
    <input type="button" id="QueryButton1" value="WebSocket Test"
           onclick="websocket();" />
       <br /><br />
    <span id="thtil"></span><p />
    <div id="dataDiv">
    </div>
</body>
</html>

 

标签:WebApi,donet,websocket,socket,System,innerSocket,ws,var,using
From: https://www.cnblogs.com/leavind/p/16715859.html

相关文章

  • .NET 6 EFCore WebApi 使用 JMeter 进行吞吐量测试
    .NET6EFCoreWebApi使用JMeter进行吞吐量测试开发环境VS2022.NET6测试环境测试工具接口压力测试工具:JMeter数据库MySQL5.7数据库和WebApi服务在同一台服务......
  • asp.net webapi 全局设置 所有api controller安全认证的方法、判断是否登录的方法
    asp.netwebapi全局设置所有apicontroller安全认证的方法、判断是否登录的方法1.新建AuthAttribute特性publicclassAuthAttribute:ActionFilterAttribute......
  • WebSocket 服务端和客户端
    IDictionary<string,IWebSocketConnection>SocketList=newDictionary<string,IWebSocketConnection>();privatevoidstartSockeListener(){......
  • Netty+WebSocket整合STOMP协议
    1.STOMP协议简介常用的WebSocket协议定义了两种传输信息类型:文本信息和二进制信息。类型虽然被确定,但是他们的传输体是没有规定的,也就是说传输体可以自定义成什么样的数据......
  • vue+websocket
    一、websocket是什么WebSocket通信协议于2011年被IETF定为标准RFC6455,并由RFC7936补充规范。WebSocketAPI也被[W3C]定为标准。它算是html5规范中的一个部分,算是一种协......
  • mosquitto配置protocol websockets无效,MQTT X或其他程序连接不上
    mqtt(mosquitto)配置protocolwebsockets必须配置socket_domain#mqtt协议配置,分为IP4和IP6两种,当前可以只配置启用一种listener18830.0.0.0socket_domainipv4protoco......
  • 初识WebSocket
    初识WebSocket一、WebSocket的用途参考:https://blog.csdn.net/qq_43842093/article/details/123158436https://cloud.tencent.com/developer/article/2028722大致可以......
  • 微信小程序websocket的使用
    微信小程序中使用websocket分为两步:一、现在微信公众平台的开发者工具中配置socket的域名   二、开始编写业务代码业务代码大致可以分成三个步骤:a.发起请求,建立......
  • PaddleOCR在 windows下的webAPI部署方案
    很多小伙伴在使用OCR时都希望能过采用API的方式调用,这样就可以跨端跨平台了。本文将介绍一种基于python的PaddleOCR识方案。喜欢的可以关注公众号,获取更多内容。#一、w......
  • HttpClient和IHttpClientFactory借助第三方库生成的客户端Refit andWebApiClientCore
    理解ASP.NETCore-发送Http请求(HttpClient)  注:本文隶属于《理解ASP.NETCore》系列文章,请查看置顶博客或点击此处查看全文目录前言在.NET中,我们有很多发送Ht......