精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

99热播精品免费| 深夜福利视频一区| 一区二区电影| 精品国产a毛片| www日韩视频| 国产精品久久久久久福利| 国产成人在线视频网站| 97av在线视频| 久久久久人妻一区精品色| ccyy激情综合| 日韩欧美成人网| 特级毛片在线免费观看| 无码国精品一区二区免费蜜桃| 久久亚洲欧美| 欧美激情久久久久| 日本污视频网站| 老牛国内精品亚洲成av人片| 欧美日韩国产中文| 免费无码不卡视频在线观看| 欧洲不卡av| 99精品久久只有精品| 91精品国产综合久久香蕉最新版| 国产精品成人免费一区二区视频| 超碰成人久久| 亚洲女同性videos| 95视频在线观看| 小说区图片区亚洲| 欧美性少妇18aaaa视频| 欧美日韩福利在线| 欧美13一16娇小xxxx| 久久色视频免费观看| 国产精品v欧美精品∨日韩| 亚洲一线在线观看| 日本亚洲欧美天堂免费| 7777精品视频| 日本五十熟hd丰满| 亚洲欧美综合| 久久久91精品| www.com.av| 国内黄色精品| 亚洲新声在线观看| 91精品人妻一区二区三区蜜桃欧美| 亚洲小说春色综合另类电影| 欧美日本免费一区二区三区| 日韩在线xxx| 天堂av在线| 五月婷婷综合激情| 日韩亚洲欧美视频| 国产盗摄精品一区二区酒店| 亚洲精品久久久久久国产精华液| 性做爰过程免费播放| 日本在线免费| 中文字幕日韩欧美一区二区三区| 亚洲激情一区二区三区| www 日韩| 国产精品麻豆欧美日韩ww| 日韩福利视频| 91视频在线观看| 中文文精品字幕一区二区| 三区精品视频观看| 成人免费高清在线播放| 日本一区二区免费在线观看视频 | 国产亚洲字幕| 91精品国产一区二区人妖| www.51色.com| 中文字幕区一区二区三| 精品国产一区二区三区四区四| 四虎国产精品永久免费观看视频| 免费欧美网站| 亚洲国产精品高清久久久| 亚洲av无码一区二区三区网址| 日韩最新在线| 亚洲香蕉成视频在线观看| 国产农村妇女精品一区| 99久久激情| 九九热这里只有精品6| 国产精品成人av久久| 亚洲综合社区| 国产精品自产拍在线观看| 国产人妖在线播放| 成人美女在线观看| 日韩av一区二区三区在线| 国产福利在线观看| 中文字幕日韩一区| 91丨porny丨探花| 播放一区二区| 日韩一区二区三区在线| 中国特级黄色大片| 精品精品99| 久久综合色88| 国产成人精品片| 热久久一区二区| 91黄色国产视频| 青青色在线视频| 亚洲日本在线看| 成人性生活视频免费看| 99久久精品一区二区成人| 日韩一区二区三区精品视频| 超碰caoprom| 欧美gayvideo| 91国产一区在线| 精品乱码一区内射人妻无码| 国产成人午夜片在线观看高清观看| 精品视频第一区| 国产一二区在线| 色综合天天做天天爱| 伦伦影院午夜理论片| 红杏视频成人| 久久精品视频播放| jizz国产在线观看| 成人黄色在线网站| 亚洲人成77777| 波多视频一区| 精品日韩在线观看| www日韩在线| 日韩精品欧美精品| 久久亚洲国产精品日日av夜夜| 爆操欧美美女| 欧美三级三级三级爽爽爽| 一本加勒比波多野结衣| 你懂的国产精品永久在线| 国产精品视频xxx| 蜜桃成人在线视频| 亚洲高清免费观看| 伊人五月天婷婷| 日韩av二区| 国产成一区二区| 五月婷婷伊人网| 亚洲成在人线免费| wwwxxxx在线观看| 亚洲成av人片乱码色午夜| 国产精品久久久久久久久久| 国内精品久久久久久影视8| 男人操女人的视频网站| 美女看a上一区| 日本不卡一区二区三区在线观看 | 国产国语videosex另类| 日本wwwxxxx| 亚洲一区二区三区在线播放| 色综合五月婷婷| 国产精品国产一区| 国产一区二区丝袜| 婷婷免费在线视频| 欧美三级中文字| 奇米网一区二区| 免费成人在线观看视频| 神马一区二区影院| 久久婷婷五月综合色丁香| 中文亚洲视频在线| 中文字幕人妻一区二区在线视频| 欧美国产精品久久| 一区二区三区 日韩| 久久人人99| 成人免费福利视频| 亚洲精品白浆| 精品久久久久久最新网址| 精品一级少妇久久久久久久| 成人免费视频网站在线观看| 国产 日韩 亚洲 欧美| 最近国产精品视频| 国产精品久久久久久久av电影| 国产精品一二三区视频| 欧美日韩美女一区二区| 小向美奈子av| 福利91精品一区二区三区| 欧美亚洲日本一区二区三区| 免费看久久久| 国产精品美女www| 国产网站在线免费观看| 精品久久久久久久久久久久久久久久久 | 欧美日韩中文国产一区发布| 三级在线电影| 欧美在线观看视频在线| 国精产品久拍自产在线网站| 国产精品自在在线| 精品久久久久久无码中文野结衣| 国产精品天天看天天狠| 国产成人a亚洲精品| 免费**毛片在线| 精品国产一二三区| 国产精品第5页| 中文字幕亚洲欧美在线不卡| 欧美人与性动交α欧美精品| 99精品热视频只有精品10| 日本午夜精品一区二区| 国产一区二区三区免费在线| 97精品国产97久久久久久| lutube成人福利在线观看| 日韩一级片在线播放| 欧美h在线观看| 亚洲少妇30p| 欲求不满的岳中文字幕| 美腿丝袜亚洲一区| 欧美,日韩,国产在线| 日韩中文首页| 国产日韩欧美综合精品 | 成人免费视频97| 国产v日韩v欧美v| 俺去了亚洲欧美日韩| 日本免费一区视频| 精品视频123区在线观看| 久久av高潮av无码av喷吹| 亚洲国产激情av| 国产情侣久久久久aⅴ免费| 日本va欧美va瓶| 免费av手机在线观看| 91精品啪在线观看国产18| 久久精品日产第一区二区三区| 大胆国模一区二区三区| 日本国产欧美一区二区三区| 日本高清在线观看视频| 欲色天天网综合久久| 日韩永久免费视频| 91精品国产综合久久久久久漫画| 草久久免费视频| 亚洲自拍偷拍av| 男人在线观看视频| 中文字幕精品一区二区精品绿巨人 | 国产成人免费av在线| wwww.国产| 乱人伦精品视频在线观看| 国产一区二区三区小说| 亚欧美无遮挡hd高清在线视频 | 欧美一区成人| 亚洲v国产v在线观看| 亚洲理论电影| 精品久久久久久中文字幕动漫| 美女久久精品| 成人两性免费视频| 亚洲三级在线| 国产日韩中文字幕在线| 国产毛片精品久久| 国产精品久久久久久亚洲影视 | 久久久久亚洲av无码专区桃色| 国产福利一区在线| 亚洲综合在线一区二区| 久久精品免费观看| 日韩一级免费片| 欧美a级一区二区| caoporn超碰97| 日韩 欧美一区二区三区| 久久久久久久久久久免费视频| 99热在线精品观看| 欧美一区二区中文字幕| 日韩一级精品| 动漫av网站免费观看| 国产视频一区三区| 国产在线青青草| 三级成人在线视频| www.色偷偷.com| 久久超级碰视频| 黄色小视频免费网站| 紧缚捆绑精品一区二区| 色网站在线视频| 国产精品一卡二| 亚洲欧美日韩偷拍| 99久久婷婷国产综合精品| 免费成人蒂法网站| 91理论电影在线观看| 亚洲AV无码成人精品区明星换面| 国产婷婷色一区二区三区四区| 亚洲女优在线观看| 国产精品家庭影院| 国产97免费视频| 亚洲福利国产精品| 日日夜夜操视频| 欧美美女视频在线观看| 99在线观看精品视频| 精品国产伦理网| 免费在线高清av| 日韩在线视频国产| 成人免费高清观看| 国产97色在线|日韩| 久久电影天堂| 成人自拍视频网站| 久久av免费看| dy888午夜| 国产一级久久| 狠狠干狠狠操视频| 成人激情视频网站| 精品熟妇无码av免费久久| 亚洲精品国久久99热| 国产视频91在线| 欧美高清视频在线高清观看mv色露露十八 | av老司机在线观看| 国产精品福利无圣光在线一区| 99久久999| 麻豆传媒一区二区| 亚洲91精品| 无码人妻丰满熟妇区毛片18 | 国产精品久久久久久在线观看| 久久精品在这里| 美女福利视频在线观看| 欧美视频在线观看免费| 国产女同91疯狂高潮互磨| 日韩精品在线播放| 国产丝袜在线| 国产精品白嫩美女在线观看| 美女日韩一区| 亚洲国产精品www| 一区二区三区四区五区精品视频| 羞羞的视频在线| 91麻豆swag| 亚洲精品在线观看av| 欧美喷潮久久久xxxxx| 深夜福利在线看| 欧美精品在线免费播放| 91在线成人| 久久久久久国产精品mv| 欧美国产高潮xxxx1819| 一本色道久久亚洲综合精品蜜桃| 成人免费视频免费观看| 18岁成人毛片| 色av成人天堂桃色av| 污视频软件在线观看| 欧美成人久久久| 亚洲精品自拍| 亚洲高清视频一区二区| 久久久久看片| 特大黑人巨人吊xxxx| 亚洲国产成人高清精品| 国产成人精品一区二区无码呦 | 欧美一卡二卡在线观看| eeuss影院www在线观看| 情事1991在线| 秋霞在线一区| 男女啪啪免费视频网站| 从欧美一区二区三区| 青娱乐91视频| 日韩西西人体444www| 精品国产丝袜高跟鞋| 国产美女久久精品香蕉69| 国产乱码精品一区二区三区四区| 亚洲熟妇av日韩熟妇在线| 成人爱爱电影网址| 久久久久久久久99| 日韩免费福利电影在线观看| 很黄的网站在线观看| 成人免费在线视频网站| 四季av一区二区三区免费观看| 精品日韩久久久| 国产精品久久久久aaaa樱花| 亚洲在线免费观看视频| 日韩在线视频免费观看高清中文| 久久精品资源| 免费成人深夜夜行网站视频| 韩国v欧美v日本v亚洲v| 国产一区二区视频在线观看免费| 91麻豆精品国产自产在线 | 亚洲成av人在线观看| 蜜臀久久99精品久久久| 欧美精品videossex性护士| 国产精品毛片av| jizzjizz国产精品喷水| 久久蜜桃av一区二区天堂 | 日韩免费三级| 免费成人在线观看视频| 欧美视频www| 亚洲国产高清福利视频| 自拍视频在线看| 涩涩涩999| 国产最新精品精品你懂的| 久久影院一区二区| 精品亚洲夜色av98在线观看| 国产成人免费9x9x人网站视频| 亚洲成色最大综合在线| 国产成人精品综合在线观看| 色网站在线播放| 伊人男人综合视频网| 精品中文字幕一区二区三区四区| 国产精品视频一二三四区| 99v久久综合狠狠综合久久| 免费看一级视频| 久久久国产精品x99av| 国产精品一区二区中文字幕| 热久久精品国产| 亚洲日本青草视频在线怡红院| 三级在线观看网站| 国产成人精品a视频一区www| 亚洲成人国产| 30一40一50老女人毛片| 欧美人牲a欧美精品| 俄罗斯一级**毛片在线播放| 日本一区美女| 国产成人午夜视频| 狠狠躁夜夜躁人人爽视频| 久久国产精品久久精品| 亚洲免费福利一区| 污污的视频免费观看| 午夜伊人狠狠久久| av网在线观看| 国产欧美日韩视频一区二区三区| 日韩av在线播放中文字幕| 免费在线观看亚洲| 亚洲一二在线观看| 福利电影一区| 亚洲欧美aaa| 日本韩国欧美一区| av2020不卡| 蜜桃视频成人在线观看|