日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WebSocket In ASP.NET Core

發布時間:2023/12/4 asp.net 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebSocket In ASP.NET Core 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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... 相關操作
///Summary
app.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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。