What Is WebSocket?

WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,是建立在TCP上、且独立的协议。在WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就可以进行持久性的连接,并进行双向数据传输。

  为了建立WebSocket 连接,浏览器 通过 Http 1.1 协议的101 StatusCode 进行握手。

 以下是我本地的一个WebSocket 握手请求的例子:

Client Request:

GET ws://localhost:62713/ws HTTP/1.1Host: localhost:62713Connection: UpgradePragma: no-cacheCache-Control: no-cacheUpgrade: websocketOrigin: http://localhost:62713Sec-WebSocket-Version: 13User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36DNT: 1Accept-Encoding: gzip, deflate, brAccept-Language: en,zh-CN;q=0.8,zh;q=0.6,zh-TW;q=0.4Sec-WebSocket-Key: aXo04R8eiNAZOIO1WJqXEQ==Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

Server Response:

HTTP/1.1 101 Switching ProtocolsConnection: UpgradeDate: Fri, 15 Sep 2017 03:10:05 GMTServer: KestrelUpgrade: websocketSec-WebSocket-Accept: gmzB2zS5RSQhQT9LFZXZczHMjKQ=

一些关键字段的说明,

  • Connection 必须设置为 Upgrade,表示客户端希望连接升级。

  • Upgrade 字段必须设置 Websocket,表示希望升级到 Websocket 协议。

  • Sec-WebSocket-Key: 是一个 Base 64 Encode 的值,服务端会用这些数据来构造出一个SHA-1 的信息摘要。之后进行 Base-64 编码,将结果作为 Sec-WebSocket-Accept 头的值,返回给客户端。

关键词: 持久连接,持久化协议,全双工

What Is This Article About?

 这篇文章你会了解到的是 WebSocket 在.NET-Core 中的一些基础实现和实践,首先先以官方给出的WebSocket入门,然后再构建WebSocket中间件,最后会用WebSocket 来实现一个实时聊天的小Demo。

Use WebSockets In ASP.NET Core

A Simple Explaination For Official Demo

 首先以官方给出的WebSocket的例子入门,大致介绍一下。效果图大概就是下面这样的。

就是我发什么信息,服务器就实时回复我什么信息。主要代码如下:首先要接受

// Configure function ///Summary// 这里主要是监听 WebSocket的请求,然后Invoke Echo 方法进行相关操作。比如,它接受到浏览器发来 WebSocket 的Close 命令了,那么在Echo 方法直接 await webSocket.CloseAsync(result.CloseStatus.Value... 相关操作///Summaryapp.Use(async (context, next) =>{                if (context.Request.Path == "/ws")     {                         if (context.WebSockets.IsWebSocketRequest)                      {                                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();                        await Echo(context, webSocket);          }                          else{context.Response.StatusCode = 400;}}});           //Echo functionprivate async Task Echo(HttpContext context, WebSocket webSocket)        {                       var buffer = new byte[1024 * 4];               WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);                           while (!result.CloseStatus.HasValue){                                await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);}                    await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);}

前端使用 js 来发送WebSocket 请求,让我们来看一下当我点击 Connect 时,到底发生了什么。下面用动图来演示一下。

是不是很熟悉,首先通过Http 发送101 ,转换协议,然后就进行WebSocket 通信了。因为在前面已经介绍过了WebSocket的工作原理了。

如果把Echo 方法中 Send 方法的 buffer修改,你就可以自己设定想要的回馈,

var abuffer = Encoding.ASCII.GetBytes("Hola, This is robert from cnblogs."); await webSocket.SendAsync(new ArraySegment<byte>(abuffer, 0, abuffer.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(abuffer), CancellationToken.None);

结果就如下图所示这样:

官方的例子讲解就到这里了。可以自己动手实践一下。接下来讲解如何基于上述的例子我们来构建一个在线实时聊天系统。

Building Real-Time WebSocket Demo

 效果图是下面这样的,

具体怎么实现的,下篇博文介绍。

WebSocket In ASP.NET Core相关推荐

  1. WebSocket In ASP.NET Core(二)

    Introduce   上篇博文中,介绍了WebSocket的基本原理,以及一个简单的Demo用来对其有一个大致的认识.这篇博文讲的是我们平常在网站上可能会经常遇到的--实时聊天,本文就是来讲在.NE ...

  2. 在ASP.NET Core下使用SignalR技术

    一.前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 .这次的主角是SignalR它为我们提 ...

  3. ASP.NET Core 高级(一)【.NET 的开放 Web 接口 (OWIN)】

    ASP.NET Core 中 .NET 的开放 Web 接口 (OWIN) ASP.NET Core 支持 .NET 的开放 Web 接口 (OWIN). OWIN 允许 Web 应用从 Web 服务 ...

  4. 快速搭建CentOS+ASP.NET Core环境支持WebSocket

    以前用python,go尝试在linux下做web服务,python没有强类型支持与高性能,go又没有很好的集成开发环境(还有强迫症的语法),回头看了几次.net,都没有时间尝试,现终于实现了这些想法 ...

  5. ASP.NET Core官方计划路线及需要废除的一些Framework技术

    概述 下面是 ASP.NET Core的时间表和路线图. 注意日期和特性都可能更改. 作为.NET Core这么大的一个项目,很难准确预测每一个计划的是否有变动. 即便如此,我们还是计划公开和透明的实 ...

  6. 在 .NET 6 Preview 3 ASP.NET Core 更新

    .NET 6 Preview 3现在可用了,其中包括对ASP.NET Core的许多重大改进. 这是此预览版本中的新增功能: 更小的SignalR,Blazor Server和MessagePack ...

  7. .NET 6 Preview 3 中 ASP.NET Core 的更新和改进

    原文:bit.ly/2Qb56NP 作者:Daniel Roth 译者:精致码农-王亮 .NET 6 预览版 3 现已推出,其中包括许多对新的 ASP.NET Core 改进.以下是本次预览版的新内容 ...

  8. asp.net core 使用 TestServer 来做集成测试

    asp.net core 使用 TestServer 来做集成测试 Intro 之前我的项目里的集成测试是随机一个端口,每次都真实的启动一个 WebServer,之前也有看到过微软文档上 TestSe ...

  9. ASP.NET Core Blazor 初探之 Blazor Server

    上周初步对Blazor WebAssembly进行了初步的探索(ASP.NET Core Blazor 初探之 Blazor WebAssembly).这次来看看Blazor Server该怎么玩. ...

最新文章

  1. 不同场景下MySQL的迁移方案
  2. 求1+2+3+...+n的值。
  3. Linux线程(五)
  4. Java中不一致的操作会扩大规则
  5. linux内核版本 2.6.39,编译RedHat Linux-2.6.39内核
  6. 2.1.3 Sorting a Three-Valued Sequence 三值的排序
  7. dw选项卡代码_Dreamweaver中js实现竖向选项卡或滑动门代码!急!!!
  8. 为什么我用腾讯会议录屏没声音?教你一招搞定!
  9. 北大核心期刊目录2020_音乐舞蹈类核心期刊目录(2020年最新收藏版)
  10. 极域电子教室解除控制
  11. cad2016中选择全图字体怎么操作_一键完成CAD转PDF,CAD编辑,CAD打印,无奈没人知道这波骚操作!...
  12. MS17-010(永恒之蓝) 漏洞检测及利用教程
  13. jupyter notebook 之 pandas
  14. 【SpringBoot实战】分布式定时任务锁Shedlock
  15. r5 3500u和r5 4500u的区别
  16. LeetCode(力扣)_接雨水
  17. openstack创建云主机流程
  18. 免疫佐剂CpG ODN说明——艾美捷CpG ODN 方案
  19. 【柜子设计】草图大师及插件AFU321安装
  20. 中秋快乐!2019年互联网公司月饼哪家强?

热门文章

  1. 以软件推动工业进步 -嵌入式学习网站
  2. 思科3550 IOS
  3. 朋友公司招聘用的一套C#基础面试题,10个码农8个错2个蒙,我也跳坑了…
  4. 我做的百度飞桨PaddleOCR .NET调用库
  5. .NET生态现状:超一半 .NET开发者使用C# 8、.NET Framework使用量减少
  6. 一个简单的方式搞定密码的加盐哈希与验证
  7. 轻量级NuGet—BaGet
  8. Delphi 26 岁
  9. 聊一聊Load Average
  10. 盘点大厂的那些开源项目 - 华为