精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

.NET WebSocket 核心原理初體驗

開發 前端
本文將利用WebSockets(SignalR的一部分)搭建一個可雙向通信的ASP.NETCore5應用。

[[394555]]

本文將利用WebSockets(SignalR的一部分)搭建一個可雙向通信的ASP.NETCore5應用。

( 預告:下期將著重對比gRPC和WebSockets的差異和使用場景)

我們先深入研究基本概念,以了解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.客戶端/服務器協商連接細節。如果條款不匹配,任何一方都可以退出。

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

請注意:客戶端發送Connection:Upgrade和Upgrade:websocket請求頭 服務端握手響應:

  1. HTTP/1.1 101 Switching Protocols 
  2. Upgrade: websocket 
  3. Connection: Upgrade 
  4. Sec-WebSocket-Accept: CTPN8jCb3BUjBjBtdjwSQCytuBo= 

注意:服務端返回HTTP/1.1 101 Switching Protocols狀態碼,其他非101的狀態碼都指示握手失敗。

數據傳輸

任意一方可以在任意時間發送消息,因為這是全雙工通信協議。

消息由一個或多個幀組成,一個幀可以是二進制、文本、控制幀(0x8 Close,0x9 Ping,0xA Pong)

.NETCore Server listening WebSockets

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

為簡化本次內容,我不會談論SignalR(集線器和其他東西)。

本次將完全基于WebSocket通信。

  1. app.UseWebSockets(); 

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

  1. using System; 
  2. using System.Net.WebSockets; 
  3. using System.Text; 
  4. using System.Threading; 
  5. using System.Threading.Tasks; 
  6. using Microsoft.AspNetCore.Mvc; 
  7. using Microsoft.Extensions.Logging; 
  8. namespace WebSocketsTutorial.Controllers 
  9.     [ApiController] 
  10.     [Route("[controller]")] 
  11.     public class WebSocketsController : ControllerBase 
  12.     { 
  13.         private readonly ILogger<WebSocketsController> _logger; 
  14.         public WebSocketsController(ILogger<WebSocketsController> logger) 
  15.         { 
  16.             _logger = logger; 
  17.         } 
  18.         [HttpGet("/ws")] 
  19.         public async Task Get() 
  20.         { 
  21.           if (HttpContext.WebSockets.IsWebSocketRequest) 
  22.           { 
  23.               using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); 
  24.               _logger.Log(LogLevel.Information, "WebSocket connection established"); 
  25.               await Echo(webSocket); 
  26.           } 
  27.           else 
  28.           { 
  29.               HttpContext.Response.StatusCode = 400; 
  30.           } 
  31.         } 
  32.          
  33.         private async Task Echo(WebSocket webSocket) 
  34.         { 
  35.             var buffer = new byte[1024 * 4]; 
  36.             var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); 
  37.             _logger.Log(LogLevel.Information, "Message received from Client"); 
  38.             while (!result.CloseStatus.HasValue) 
  39.             { 
  40.                 var serverMsg = Encoding.UTF8.GetBytes($"Server: Hello. You said: {Encoding.UTF8.GetString(buffer)}"); 
  41.                 await webSocket.SendAsync(new ArraySegment<byte>(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None); 
  42.                 _logger.Log(LogLevel.Information, "Message sent to Client"); 
  43.                 result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); 
  44.                 _logger.Log(LogLevel.Information, "Message received from Client"); 
  45.                  
  46.             } 
  47.             await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); 
  48.             _logger.Log(LogLevel.Information, "WebSocket connection closed"); 
  49.         } 
  50.     } 

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

啟動ASP.NET Core 服務端,程序在/ws路由地址監聽WebSockets連接, 回發客戶端發送過來的消息。

Browser client using WebSockets api

在瀏覽器Console編寫js代碼發起客戶端websockets請求:

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

在該請求的network- Messages tab頁面可觀察雙向通信:

除此之外,服務器/客戶端維護了pingpong機制,以確認客戶端是否還存活。

如果您真的想看看這些數據包,使用WireShark之類的工具了解一下。

整個過程在Chrome-Network上只會有一個記錄,所以你如果要看"握手過程", 也請在剛在的tab頁面查看??。

最后

如果您有興趣了解WebSocket的協議規范,請轉至RFC 6455閱讀。

 

這篇文章只是WebSockets的小試牛刀,還有許多我們可以討論的其他事情,例如安全性,負載平衡,代理等??。

 

責任編輯:武曉燕 來源: 全棧碼農畫像
相關推薦

2009-08-01 09:06:35

UbuntuOneLinux開源操作系統

2009-03-09 15:12:39

XenServer安裝

2023-07-15 08:01:38

2010-10-18 09:03:44

ASP.NET MVC

2010-11-22 10:31:17

Sencha touc

2011-05-30 15:12:10

App Invento 初體驗

2013-06-08 10:15:29

Outlook 201Outlook 201

2011-11-01 10:30:36

Node.js

2010-12-13 11:39:39

2011-08-02 10:26:59

iOS 多線程 線程

2011-09-15 15:03:10

2025-03-18 07:30:41

2009-11-30 10:09:02

谷歌Chrome OS

2013-05-28 10:22:03

2024-12-23 07:00:00

FastExcelEasyExcel開源框架

2023-07-17 08:34:03

RocketMQ消息初體驗

2009-07-21 13:08:08

iBATIS DAO

2011-09-05 10:20:21

Sencha ToucAPP

2017-09-05 05:55:24

AWS ES集群大數據

2025-04-10 07:30:43

點贊
收藏

51CTO技術棧公眾號

国产亚洲一区在线| 亚洲18在线| 91免费看视频| 国产极品jizzhd欧美| 国产探花视频在线播放| 欧美91在线|欧美| 亚洲视频综合在线| 91麻豆精品国产自产在线观看一区| 在线日本制服中文欧美| 亚洲国产经典视频| 亚洲综合中文字幕在线| 日韩av片在线播放| 成人三级视频| 欧美精品一区二区蜜臀亚洲| 免费黄色特级片| 2024最新电影免费在线观看| 97超碰欧美中文字幕| 国产精品一区电影| 日韩精品在线免费看| 97欧美在线视频| 亚洲韩国日本中文字幕| 日本成人在线免费视频| 日韩精品亚洲人成在线观看| 久久久久99精品一区| 97免费资源站| 做爰无遮挡三级| 亚洲午夜极品| 久久成人在线视频| 69精品无码成人久久久久久| 成人春色在线观看免费网站| 欧美日本在线视频| 欧美日韩在线不卡视频| 免费污视频在线观看| 国产精品久久网站| 欧美一区二区三区在线免费观看| 亚洲第一色网站| 久久国产精品72免费观看| 8090成年在线看片午夜| 九九热国产精品视频| 日韩www.| 一区二区三区四区视频| 精品久久久久久中文字幕人妻最新| 欧美国产中文高清| 欧美丰满一区二区免费视频| 久久国产精品网| 黄网av在线| 亚洲一区二区三区在线播放| 99中文字幕在线观看| 亚洲天天影视| 中文欧美字幕免费| 日韩精品另类天天更新| 嫩草研究院在线观看| 97精品久久久午夜一区二区三区 | 2001个疯子在线观看| 亚洲欧美综合色| 一区二区在线不卡| 91成人高清| 国产精品三级av| 亚洲激情啪啪| 91精品专区| 国产精品你懂的在线欣赏| 深田咏美在线x99av| 狠狠v欧美ⅴ日韩v亚洲v大胸| 久久久久国色av免费看影院| 欧洲亚洲一区| jizzjizz在线观看| 国产精品萝li| 久久最新免费视频| 日韩字幕在线观看| 六十路在线观看| www精品美女久久久tv| 玛丽玛丽电影原版免费观看1977 | 国产精品1024| 99精彩视频在线观看免费| 亚洲av无码片一区二区三区| 岛国精品一区二区| 免费99视频| 成人免费一区二区三区视频网站| 中文字幕第一区第二区| 中文精品视频一区二区在线观看| 18av在线视频| 午夜久久久久久| 哪个网站能看毛片| 日本一区二区三区中文字幕| 91精品国产综合久久久蜜臀粉嫩 | 久久精品成人动漫| 国产免费一区二区三区网站免费| 青草国产精品| 九九热r在线视频精品| 日本少妇性高潮| 久久亚洲风情| 91久久久久久| 色呦呦中文字幕| 中文字幕成人av| 伊人再见免费在线观看高清版| 18video性欧美19sex高清| 色999日韩国产欧美一区二区| 亚洲xxx在线观看| 粉嫩精品导航导航| 在线视频欧美性高潮| www青青草原| 久久久噜噜噜久久狠狠50岁| 91麻豆国产精品| 瑟瑟在线观看| 一区二区在线观看免费视频播放| 免费高清在线观看免费| 欧美男女视频| 国产乱子伦一区二区三区国色天香| 一卡二卡欧美日韩| 欧美日韩一级在线| 在线视频cao| 91精品国产丝袜白色高跟鞋| 91av在线免费| 欧美有码视频| 国产精品黄视频| 日本人妻熟妇久久久久久| 国产精品伦一区二区三级视频| 国产69精品久久久久999小说| 国产精品麻豆成人av电影艾秋| 亚洲黄色免费三级| 精品国产视频一区二区三区| 老司机精品视频网站| 国产精品国产精品| 麻豆电影在线播放| 色婷婷av一区二区三区gif | 天堂网视频在线| 国产美女一区二区| 亚洲精美视频| 欧美www.| 亚洲乱亚洲乱妇无码| 久久久久久久9999| 国产一级精品在线| 日日噜噜噜夜夜爽爽| 99riav视频一区二区| 亚洲欧美国产日韩中文字幕| 日本少妇毛茸茸高潮| 国产a区久久久| 亚洲免费视频播放| 久久99国产精品二区高清软件| 亚洲免费人成在线视频观看| 日韩三级视频在线播放| 精品国产亚洲av麻豆| 视频一区中文字幕国产| 国产伦精品一区二区三区免费视频| 快射av在线播放一区| 欧美午夜免费电影| 国产伦理片在线观看| 久久久久国产一区二区| 久久久久久久久久久久久久久久av| 另类视频在线| 日韩精品一区二区三区四区视频| 婷婷伊人五月天| 国产综合色精品一区二区三区| 亚洲一区三区视频在线观看| 韩国女主播一区二区| 亚洲新中文字幕| 奴色虐av一区二区三区| 国产色婷婷亚洲99精品小说| www.四虎成人| 精品一级毛片| 国产美女精品免费电影| 国产激情在线观看| 日韩欧美亚洲国产精品字幕久久久| 日本aⅴ在线观看| 国产一区在线看| 日韩亚洲欧美一区二区| 91在线一区| 欧美与欧洲交xxxx免费观看| 你懂的视频在线| 欧美日韩一二三区| 中文字幕在线观看2018| 国产东北露脸精品视频| 日韩精品一区二区三区四 | 精品免费二区三区三区高中清不卡| 欧美xxx黑人xxx水蜜桃| 亚洲精品乱码久久久久久按摩观| 国产三级精品三级在线观看| 国产精品久久久久久亚洲伦| 国产又粗又长又爽又黄的视频| 午夜欧美精品久久久久久久| 国产区二精品视| 日韩高清中文字幕一区二区| 色偷偷亚洲男人天堂| 国产老女人乱淫免费| 亚洲妇熟xx妇色黄| 国产精品密蕾丝袜| 激情国产一区二区 | free性护士videos欧美| 亚洲乱码一区av黑人高潮| 一女二男一黄一片| 亚洲成人7777| 你懂得在线观看| av高清不卡在线| 成年网站在线播放| 狠狠入ady亚洲精品经典电影| 欧美资源一区| 精品国产亚洲一区二区三区大结局| 午夜精品蜜臀一区二区三区免费 | 久久精品久久久久久| 欧美77777| 欧美日韩情趣电影| 日韩精品视频播放| 亚洲人吸女人奶水| 精品国产av无码| 国产成人啪免费观看软件| 国产偷人视频免费| 亚洲无吗在线| 一区二区三区久久网| 久久亚洲黄色| 91丨九色丨国产在线| 国产高清不卡| 欧美国产第一页| 在线观看免费黄色| 亚洲免费福利视频| 色婷婷av一区二区三区之e本道| 欧美在线不卡视频| 欧美三级一区二区三区| 艳妇臀荡乳欲伦亚洲一区| 日韩毛片无码永久免费看| 不卡电影一区二区三区| 欧美成人手机在线视频| 日韩av在线播放中文字幕| 妺妺窝人体色777777| 一本精品一区二区三区| 手机成人在线| 久久不见久久见国语| 韩国成人av| 中文字幕区一区二区三| 91中文字幕一区| 欧美成人黄色| 国产v综合ⅴ日韩v欧美大片 | 五月天视频一区| 欧美激情精品久久| 亚洲男人天堂av网| 小嫩苞一区二区三区| 中文字幕欧美激情| 人妻av无码一区二区三区| 91免费视频网| 在线观看国产网站| 99久久综合国产精品| 亚洲香蕉中文网| 成人免费视频播放| 成人啪啪18免费游戏链接| 国产一区二区在线看| 日本黄色福利视频| 久久丁香综合五月国产三级网站| 成人亚洲视频在线观看| 久久综合网络一区二区| 欧美污视频网站| 久久一区亚洲| 欧美国产日韩在线播放| 日韩中文字幕区一区有砖一区| 欧美视频免费播放| 久久免费国产| av污在线观看| 久久99久久久久| 国产精品探花在线播放| 国产酒店精品激情| av不卡中文字幕| 成人精品高清在线| 成人免费av片| 国产午夜亚洲精品不卡| 日本精品久久久久中文| 亚洲欧洲成人自拍| 动漫性做爰视频| 亚洲一区二区欧美激情| 日韩三级免费看| 在线亚洲欧美专区二区| 亚洲天堂中文在线| 欧美一级高清大全免费观看| 国产成人精品毛片| 日韩成人在线视频| 国产在线视频资源| 久久精品国产亚洲精品2020| 日本孕妇大胆孕交无码| 亚洲91精品在线| 蜜桃视频成人m3u8| 91香蕉嫩草影院入口| 一区二区在线视频观看| 牛人盗摄一区二区三区视频| 成人在线一区| 日韩精品一区在线视频| 视频一区视频二区中文字幕| 91小视频在线播放| 成人a免费在线看| 亚洲黄色小说视频| 亚洲最新在线观看| 中文字幕精品无| 日韩无一区二区| 九色网友自拍视频手机在线| 久久久国产精彩视频美女艺术照福利 | 在线视频一区观看| 亚洲精品看片| 91日韩视频在线观看| 成人一区二区视频| 99精品全国免费观看| 亚洲在线视频免费观看| 免费观看日批视频| 精品日韩一区二区三区免费视频| 韩国中文字幕2020精品| 欧美日本高清视频| 日本一区免费网站| 国产伦精品一区二区三区照片 | 99精品国产九九国产精品| 精品国产免费久久久久久尖叫 | 91视频国产观看| 男人的午夜天堂| 色婷婷综合视频在线观看| 亚洲成a人片77777精品| 一区二区三区四区在线观看视频 | 婷婷成人基地| 99热成人精品热久久66| 国产成人精品免费看| 夫妇露脸对白88av| 欧美色视频日本版| 亚洲精品视频91| 久久久成人av| 国产三级一区| 欧美午夜精品理论片a级大开眼界| 欧美在线亚洲综合一区| 一区二区三区免费播放| 99久久精品国产一区二区三区| 一区二区在线观看免费视频| 欧美日韩午夜在线| 久久精品蜜桃| 777777777亚洲妇女| 国产厕拍一区| 污污污污污污www网站免费| 韩国视频一区二区| 国产三级黄色片| 色婷婷久久一区二区三区麻豆| 免费观看黄色一级视频| 欧美日韩高清区| 国产精品视频一区二区三区综合| 色一情一区二区三区四区| 丝袜国产日韩另类美女| 催眠调教后宫乱淫校园| 亚洲综合999| 亚洲国产999| 九九热在线精品视频| 国产精品久久免费视频| 懂色av一区二区三区四区五区| 看片网站欧美日韩| 免费成人美女女在线观看| 欧美美女bb生活片| 欧美成人三区| 91免费高清视频| 欧美.日韩.国产.一区.二区| 国产又粗又长又爽又黄的视频| 亚洲视频综合在线| 国产黄a三级三级三级| 久久久久www| 中文字幕亚洲在线观看| 国产美女永久无遮挡| 不卡av电影在线播放| 国产成人精品一区二三区| 国产视频久久网| 欧美亚洲大片| 亚洲午夜激情| 国产精品77777| 精品亚洲永久免费| 日韩电影中文字幕在线观看| 另类专区亚洲| 亚洲一一在线| 国产91综合一区在线观看| 日韩免费一级片| 亚洲性69xxxbbb| 成人豆花视频| 性一交一乱一伧国产女士spa| 91在线观看免费视频| 在线永久看片免费的视频| 中文字幕亚洲综合| 日韩欧美中文在线观看| 国产精品网站免费| 国产亚洲人成网站| 国产又粗又猛又黄又爽| 欧美激情亚洲激情| 一区二区三区四区在线看| 亚洲最大天堂网| 亚洲制服欧美中文字幕中文字幕| 台湾av在线二三区观看| 国产精品色悠悠| 亚洲视频日本| 日韩中文字幕有码| 日韩视频在线一区二区| 热色播在线视频| 亚洲国产一区二区三区在线| 国产精品自拍在线| 日韩精品成人一区| 精品国产一区二区三区四区在线观看 | 粉嫩av蜜桃av蜜臀av| 欧美日韩美少妇 | 国产精品678| 综合久久亚洲| 天天躁日日躁aaaxxⅹ| 3d动漫精品啪啪| 久久爱91午夜羞羞| 18视频在线观看娇喘| 久久亚洲综合色| www.蜜臀av.com|