To Be Continue...html
WebSocket
是一種在單個 TCP
鏈接上進行全雙工通信的協議,是創建在TCP
上、且獨立的協議。在WebSocket API
中,瀏覽器和服務器只須要完成一次握手,二者之間就能夠進行持久性的鏈接,並進行雙向數據傳輸。前端
爲了創建WebSocket
鏈接,瀏覽器 經過 Http 1.1
協議的101 StatusCode
進行握手。git
如下是我本地的一個WebSocket
握手請求的例子:github
Client Request:
web
GET ws://localhost:62713/ws HTTP/1.1 Host: localhost:62713 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Origin: http://localhost:62713 Sec-WebSocket-Version: 13 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36 DNT: 1 Accept-Encoding: gzip, deflate, br Accept-Language: en,zh-CN;q=0.8,zh;q=0.6,zh-TW;q=0.4 Sec-WebSocket-Key: aXo04R8eiNAZOIO1WJqXEQ== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Server Response:
c#
HTTP/1.1 101 Switching Protocols Connection: Upgrade Date: Fri, 15 Sep 2017 03:10:05 GMT Server: Kestrel Upgrade: websocket Sec-WebSocket-Accept: gmzB2zS5RSQhQT9LFZXZczHMjKQ=
一些關鍵字段的說明,瀏覽器
Connection
必須設置爲 Upgrade
,表示客戶端但願鏈接升級。Upgrade
字段必須設置 Websocket
,表示但願升級到 Websocket
協議。Sec-WebSocket-Key
: 是一個 Base 64 Encode
的值,服務端會用這些數據來構造出一個SHA-1
的信息摘要。以後進行 Base-64
編碼,將結果做爲 Sec-WebSocket-Accept
頭的值,返回給客戶端。關鍵詞: 持久鏈接,持久化協議,全雙工服務器
這篇文章你會了解到的是 WebSocket 在.NET-Core 中的一些基礎實現和實踐,首先先以官方給出的WebSocket入門,而後再構建WebSocket中間件,最後會用WebSocket 來實現一個實時聊天的小Demo。websocket
首先以官方給出的WebSocket的例子入門,大體介紹一下。效果圖大概就是下面這樣的。app
就是我發什麼信息,服務器就實時回覆我什麼信息。主要代碼以下:首先要接受
// 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 function private 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);
結果就以下圖所示這樣:
官方的例子講解就到這裏了。能夠本身動手實踐一下。接下來說解如何基於上述的例子咱們來構建一個在線實時聊天系統。
效果圖是下面這樣的,
具體怎麼實現的,下篇博文介紹。😄😄
若有陳述錯誤處,請多多指正。