千家信息网

.NET WebSocket核心原理是怎样的

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,.NET WebSocket核心原理是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们先深入研究基本概念,以了解
千家信息网最后更新 2025年02月05日.NET WebSocket核心原理是怎样的

.NET WebSocket核心原理是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

我们先深入研究基本概念,以了解WebSockets幕后情况。

WebSockets简介

为支持在在客户端/服务端双向通信,引入了WebSockets.

HTTP 1.0:我们每次向服务器发送请求时都需要重新创建连接(关闭之前的连接)。

HTTP 1.1:新增keep-alive语法引入了持久连接机制, 至此连接可以被重用---这能减小通信延迟(因为服务器能感知客户端,并且不需要为每个请求重开握手过程)

WebSockets 依附于HTTP1.1协议的持久连接机制,因此如果你是第一次发起WebSockets连接,这实际是一个HTTP1.1请求,协商成功后开始全双工通信。

下图描述了初始化(握手),数据传输,关闭WebSockets的过程。

协议有两部分:握手和数据传输

握手

WebSocket与HTTP协议有良好兼容性。"握手"阶段采用Http协议,默认也是80/443端口,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

ws://example.com:80/some/path

简而言之,WebSocket连接基于单个端口上的HTTP(以TCP传输):

1.服务器在指定的端口(如80/443)上监听传入的TCP套接字连接

2.客户端使用HTTP GET请求启动握手 (这就是"WebSockets"中的"Web"由来)。

在请求头中,客户端将要求服务器将连接Upgrade到WebSocket。

3.服务器发送握手响应,通知客户端它将把协议从HTTP更改为WebSocket。

4.客户端/服务器协商连接细节。如果条款不匹配,任何一方都可以退出。

GET /ws-endpoint HTTP/1.1 Host: example.com:80 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: L4kHN+1Bx7zKbxsDbqgzHw== Sec-WebSocket-Version: 13

请注意:客户端发送Connection:Upgrade和Upgrade:websocket请求头 服务端握手响应:

HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: CTPN8jCb3BUjBjBtdjwSQCytuBo=

注意:服务端返回HTTP/1.1 101 Switching Protocols状态码,其他非101的状态码都指示握手失败。

数据传输

任意一方可以在任意时间发送消息,因为这是全双工通信协议。

消息由一个或多个帧组成,一个帧可以是二进制、文本、控制帧(0x8 Close,0x9 Ping,0xA Pong)

.NETCore Server listening WebSockets

dotnet new webapi -n WebSocketsTutorial dotnet add WebSocketsTutorial/ package Microsoft.AspNet.SignalR

为简化本次内容,我不会谈论SignalR(集线器和其他东西)。

本次将完全基于WebSocket通信。

app.UseWebSockets();

新增WebSocketsController.cs,添加如下代码:

using System; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace WebSocketsTutorial.Controllers {     [ApiController]     [Route("[controller]")]     public class WebSocketsController : ControllerBase     {         private readonly ILogger _logger;         public WebSocketsController(ILogger logger)         {             _logger = logger;         }         [HttpGet("/ws")]         public async Task Get()         {           if (HttpContext.WebSockets.IsWebSocketRequest)           {               using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();               _logger.Log(LogLevel.Information, "WebSocket connection established");               await Echo(webSocket);           }           else           {               HttpContext.Response.StatusCode = 400;           }         }                  private async Task Echo(WebSocket webSocket)         {             var buffer = new byte[1024 * 4];             var result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);             _logger.Log(LogLevel.Information, "Message received from Client");             while (!result.CloseStatus.HasValue)             {                 var serverMsg = Encoding.UTF8.GetBytes($"Server: Hello. You said: {Encoding.UTF8.GetString(buffer)}");                 await webSocket.SendAsync(new ArraySegment(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);                 _logger.Log(LogLevel.Information, "Message sent to Client");                 result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);                 _logger.Log(LogLevel.Information, "Message received from Client");                              }             await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);             _logger.Log(LogLevel.Information, "WebSocket connection closed");         }     } }

在握手之后,服务端不需要等待客户端发起消息,就可以推送消息到客户端。

启动ASP.NET Core 服务端,程序在/ws路由地址监听WebSockets连接, 回发客户端发送过来的消息。

Browser client using WebSockets api

在浏览器Console编写js代码发起客户端websockets请求:

let webSocket = new WebSocket('wss://localhost:5001/ws');

在该请求的network- Messages tab页面可观察双向通信:

除此之外,服务器/客户端维护了pingpong机制,以确认客户端是否还存活。

如果您真的想看看这些数据包,使用WireShark之类的工具了解一下。

整个过程在Chrome-Network上只会有一个记录,所以你如果要看"握手过程", 也请在刚在的tab页面查看??。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

服务 客户 客户端 服务器 通信 消息 数据 过程 传输 数据传输 机制 端口 一方 代码 内容 双向 就是 状态 页面 双工 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 辛必达互联网科技 范良刚 奥的斯电梯清除故障服务器 adobeXD安装服务器断开 莱芜软件开发公司 宝山区咨询软件开发收费标准 计算机与网络技术学习心得体会 嵌入式底层软件开发方法 ns暗黑2美版无法连接服务器 服务器虚拟化平台 软件开发转正 重庆超领科技互联网有限公司 企业服务器管理系统 手机该怎么连上服务器oppo 网络技术员的年度计划 银行业网络安全宣传报告 严阵以待后端服务器失败 襄阳串口服务器厂家价格 服务器无法验证电话号码 联想管理服务器R410 网络安全小黑板如何划分 木材物理指标数据库 小爱同学配网成功连接服务器失败 jsp mysql数据库 进入黑洞后服务器还能运行吗 浪潮服务器数据恢复出厂 安全管理app软件开发 软件登录服务器错误怎么了 网络技术发展带来的挑战 红盟网络安全工作室直播 线上配送柴油软件开发需要多少钱
0