首页 > 编程语言 >C#关于WebSocket的使用

C#关于WebSocket的使用

时间:2024-10-23 10:22:32浏览次数:9  
标签:WebSocket C# System 关于 context new var using

因为主要做CS开发,所以之前没怎么涉及WebSocket的使用。前面有个项目,想着前端能不能直接跟我这边交互,所以研究了一下.NET的WebSocket的使用。

客户端连接

客户端的连接相对比较简单,可以直接使用ClientWebSocket即可。
示例代码:

using System.Net.WebSockets;
using System.Threading;
using System;
using System.Text;

using var cws = new ClientWebSocket();
// 设置每隔 5 秒发送一个 Ping 请求
cws.Options.KeepAliveInterval = TimeSpan.FromSeconds(5);

// 如果 1 秒内请求的服务端没有响应,则终止连接
cws.Options.KeepAliveTimeout = TimeSpan.FromSeconds(1);

Uri serverUri = new Uri("ws://echo.websocket.org");
var cancellationToken = new CancellationToken();

// 连接 WebSocket 服务器
await cws.ConnectAsync(serverUri, cancellationToken);
await cws.SendAsync(Encoding.Default.GetBytes( "Hello, World!"), WebSocketMessageType.Text,true, new CancellationToken());
var buffer = new byte[1024];
await cws.ReceiveAsync(buffer, new CancellationToken());
Console.WriteLine(Encoding.Default.GetString(buffer));
Console.ReadLine();

服务端的监听

服务端的监听需要用到HttpListenerWebSocketContext,相比TCP和HTTP的监听会稍微复杂一点点。但其实也还行。
示例代码:

using System;
using System.Net;
using System.Net.Http.Headers;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;

public class SimpleWebSocketServer
{
    private HttpListener _listener;

    public async Task StartAsync(string url)
    {
        _listener = new HttpListener();
        _listener.Prefixes.Add(url);
        _listener.Start();

        Console.WriteLine($"Listening on {url}");

        while (true)
        {
            var context = await _listener.GetContextAsync();
            if (context.Request.IsWebSocketRequest)
            {
                ProcessWebSocketRequest(context);
            }
            else
            {
                // 处理非WebSocket请求
                HandleHttpRequest(context);
            }
        }
    }

    private void ProcessWebSocketRequest(HttpListenerContext context)
    {
        var webSocketContext = context.AcceptWebSocketAsync(null).Result;
        HandleWebSocketConnection(webSocketContext);
    }

    private async Task HandleWebSocketConnection(HttpListenerWebSocketContext webSocketContext)
    {
        var webSocket = webSocketContext.WebSocket;
        var buffer = new byte[1024];
        WebSocketReceiveResult result;

        do
        {
            result = await webSocket.ReceiveAsync(buffer, CancellationToken.None);

            // Echo the message back to the client
            await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
        } while (!result.CloseStatus.HasValue);

        webSocket.Dispose();
    }

    private void HandleHttpRequest(HttpListenerContext context)
    {
        // 处理普通的HTTP请求
        context.Response.StatusCode = 200;
        context.Response.Close();
    }
}

标签:WebSocket,C#,System,关于,context,new,var,using
From: https://www.cnblogs.com/wzwyc/p/18494576

相关文章

  • 最新 Seata 集成了RocketMQ事务消息,Seata 越来越 牛X 了! yyds !
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 使用EasyExcel实现导出excel文件时生成多级下拉选
    前言公司有个需求本来只涉及到两个下拉选项,后面就想能不能实现多个下拉选,当然我这里说的多个下拉选是联动的,比如省、地市、区县这种。实现步骤1、添加EasyExcel的Maven依赖<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><ver......
  • HCI_LE_Set_Random_Address(0x0005)命令全面解析
    目录一、命令概述二、命令格式2.1.HCI_LE_Set_Random_Address命令格式2.2.HCICommandComplete返回命令格式2.3.格式示例2.4.示例二进制表示三、命令参数详细说明3.1.命令代码(Opcode)3.2.参数长度(ParameterLength)3.3.随机地址(RandomAddress)四、命令返回参......
  • CMDB平台(进阶篇):企业级CMDB的高阶教程
    企业IT架构日益复杂,配置项数量庞大且关系错综复杂。为了有效管理这些配置项,确保IT服务的稳定性和可靠性,配置管理数据库(ConfigurationManagementDatabase,简称CMDB)系统应运而生。本文将深入探讨企业搭建CMDB系统所需具备的要素,以及实践路径,旨在为企业提供有益的参考和指导。 ......
  • 推荐一些关于计算机网络和 TCP/IP 协议的书籍
    以下是一些关于计算机网络和TCP/IP协议的优秀书籍推荐:《TCP/IP详解》:作者为W.RichardStevens,这是一套经典之作,分为三卷。《TCP/IP详解卷1:协议》:详细解析了TCP/IP协议的工作原理和实现细节,对协议族中的各个层次和协议,如IP、TCP、UDP等进行了深入剖析,适合想......
  • STM32第15章 RCC-使用HSE/HSI配置时钟
    时间:2024.10.21-10.23参考资料:《零死角玩转STM32》“RCC-使用HSE/HIS配置时钟”章节TIPS:从前面的历程中我们知道,程序在启动的时候会执行汇编文件,汇编文件里会调用System_Init(固件库编程的函数),它里面会把时钟初始化成72M,因此前面我们在用固件库写程序的时候,有关时钟这一部......
  • 【K8s】Kubernetes 证书管理工具 Cert-Manager
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口| 精选文章 | Kubernetes |Docker|Linux |羊毛资源 | 工具推荐 |往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决......
  • CodeQL和数据流分析的简介
    文章目录前言一、CodeQL简介二、编写污点跟踪查询扩展传播功能总结前言最近,CodeQL使用非常广泛(GitHub开发的一种强大的静态分析工具)来将代码扫描作为CI/CD管道的一部分。其核心是QL语言,它用于编写对代码进行推理的查询。与竞争对手相比,CodeQL擅长污点跟踪......
  • CAD建模软件:BricsCAD 24 Mac激活版 与多款cad软件兼容的简单CAD建筑软件
    BricsCAD24是一款功能全面的CAD设计软件,专为建筑、工程和制造等领域打造。它支持DWG、DXF等多种CAD格式,且与AutoCAD高度兼容,提供2D绘图和3D建模功能,以及BIM和机械设计工具。BricsCAD24用户界面友好,操作简便,支持自定义命令和快捷键,能够大大提高设计效率和准确性。此外,它还具备强......
  • 第41篇 Grpc实现客户端与服务端高效通信
    grpc的确是现在最流行的跨平台间的通信技术。远不止.net上使用。grpc是谷歌公司推出的跨语言平台之间的通信技术。和webapi不同的是,可以使用自己的语言和另一种语言进行通信。简单来讲就是首先使用一种Proto的协议文件,可以生成客户端和服务端两种文件。客户端和服务端可以使用任......