第六章 设计程序架构 之 设计实现WebSocket策略
1. 概述
傳統網頁的通信方式是請求-響應模式,每次請求-響應都是新的連接。連接的建立和斷開也是需要消耗資源的。
WebSocket是基于TCP協議,實現單個連接上的雙向通信。
本章內容包括: 異步讀寫字符串和二進制數據、選擇連接丟失策略、何時使用WebSocket。
2. 主要內容
2.1?異步讀寫字符串和二進制數據
* HTTP polling 是傳統的使用一系列AJAX請求來實現客戶端服務端長久連接(表面上看起來是長久連接)的方式。
* HTTP long polling 是客戶端使用AJAX請求服務端時用到的一種服務端技術。是通過阻塞進入的請求,直到當前請求操作完成 來實現的。在HTTP中,這不是一種好的方式,因為HTTP的請求響應模式不是為這種情形設計的。而且這也不是一種可靠的方式,可能會發生連接中斷的情況。
* WebSockets是一種新的支持雙工通信的技術。WebSockets使用一種特殊連接取代了客戶端/服務器模式的通信協議。
* 使用WebSockets是要考慮不支持HTML5的情況。使用??System.Web.HttpBrowserCapabilities 可以檢測。
* 基于WebSockets的通信一般包括三個步驟:
?① 通過一次握手在客戶端和服務端建立連接。
?② 請求WebSockets服務端開啟通信監聽。
?③ 傳輸數據。
?請求WebSockets時,瀏覽器首先打開一個到服務端的http連接,然后瀏覽器發送一個升級版請求(如下),如該請求被接收并處理,則握手完成。所有通信通過一個TCP Socket連接進行。
WebSocket handshake upgrade request GET /mychat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: hy6T&Ui8trDRGY5REWe4r5== Sec-WebSocket-Protocol: chat Sec-WebSocket-Version: 13 Origin: http://example.com HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: Ju6Tr4Ewed0p9Uyt6jNbgFD5t6= Sec-WebSocket-Protocol: chat實例: 使用JQuery實現一個客戶端WebSockets鏈接
var socket; $(document).ready(function () { socket = new WebSocket("ws://localhost:1046/socket/handle"); socket.addEventListener("open", function (evnt) { $("#display").append('connection');}, false); socket.addEventListener("message", function (evnt) { $("#display ").append(evnt.data);}, false); socket.addEventListener("error", function (evnt) { $("#display ").append('unexpected error.');}, false); ... }); Or using straight method calls: function connect(){ try{ var socket; var host = "ws://localhost:8000/socket/server/start"; var socket = new WebSocket(host); message('<p class="event">Socket Status: '+socket.readyState); socket.onopen = function(){ message('<p class="event">Socket Status: '+socket.readyState+' (open)'); } socket.onmessage = function(msg){ message('<p class="message">Received: '+msg.data); } socket.onclose = function(){ message('<p class="event">Socket Status: '+socket.readyState+' (Closed)'); } } catch(exception){ message('<p>Error'+exception); } }* WebSockets協議的建立,需要ASP.NET4.5及IIS8環境。?System.Web.WebSockets下的方法用來支持WebSockets相關的開發。
* 通過實現HttpContext.Current.AcceptWebSocketRequest(Func<AspNetWebSocketContext,?Task>)來支持WebSockets連接。
下面的C#代碼用來管理WebSockets連接
public async Task MyWebSocket(AspNetWebSocketContext context) { while (true) { ArraySegment<byte> arraySegment = new ArraySegment<byte>(new byte[1024]); // open the result. This is waiting asynchronously WebSocketReceiveResult socketResult = await context.WebSocket.ReceiveAsync(arraySegment, CancellationToken.None); // return the message to the client if the socket is still open if (context.WebSocket.State == WebSocketState.Open) { string message = Encoding.UTF8.GetString(arraySegment.Array, 0, socketResult.Count); userMessage = "Your message: " + message + " at " + DateTime.Now.ToString(); arraySegment = new ArraySegment<byte>(Encoding.UTF8.GetBytes(message)); // Asynchronously send a message to the client await context.WebSocket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None); } else { break; } } }2.2 如何選擇連接丟失策略
使用WebSockets時,要考慮如何處理連接意外關閉的情況。除了OnClose 和 OnError事件外,還需要更完善的處理,比如連接重建。
2.3 考慮何時使用WebSockets
當需要跟服務端進行雙工通信時,WebSockets是一個理想方案。
但是,也不是任何情況使用都是合適的。有些情況使用傳統的客戶端timer可能要更好一些。因為目前的HTML5還沒有完全普及。
另一種策略是在服務端設置一個開關,可以決定是否使用WebSockets。讓服務端決定,可以簡化客戶端的代碼。
WebSockets不包含HTTP頭,但是卻以HTTP形式發送請求。這對于很多根據HTTP頭來監測請求的地方來說,是一個潛在的威脅。是可能會被阻止的。而且這個阻止不能像瀏覽器是否支持HTML5那樣被檢測出來,只能是實際創建連接,發送數據,然后根據返回結果來判斷。
3. 總結
① Http polling 是一種利用Javascript方法連續請求服務端來獲取數據的方式。雖然不是最高效的,但是具有廣泛的瀏覽器支持。(支持Js即可)
② Http long polling 是長連接方式,服務端收到請求后會保持連接,直到處理完成返回。然后客戶端收到返回并處理完成再進行下一次連接。
③ WebSockets是一種在客戶端和服務器端提供雙工通信的方式。兩端可以同時互相通信。客戶端通過Http發送一個升級版請求到服務端,服務端收到后就會創建一個WebSockets連接。客戶端和服務端都需要寫代碼來通過socket進行交互。
④ WebSockets適用于長時間的雙向通信情況。并不是所有情況都適用,尤其是不支持HTML5的情況。
轉載于:https://www.cnblogs.com/stone_lv/p/4789530.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的第六章 设计程序架构 之 设计实现WebSocket策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux安装VScode
- 下一篇: ROS环境下跑orb-slam2 单目相