第六章 设计程序架构 之 设计实现WebSocket策略
1. 概述
傳統(tǒng)網(wǎng)頁的通信方式是請求-響應(yīng)模式,每次請求-響應(yīng)都是新的連接。連接的建立和斷開也是需要消耗資源的。
WebSocket是基于TCP協(xié)議,實現(xiàn)單個連接上的雙向通信。
本章內(nèi)容包括: 異步讀寫字符串和二進(jìn)制數(shù)據(jù)、選擇連接丟失策略、何時使用WebSocket。
2. 主要內(nèi)容
2.1?異步讀寫字符串和二進(jìn)制數(shù)據(jù)
* HTTP polling 是傳統(tǒng)的使用一系列AJAX請求來實現(xiàn)客戶端服務(wù)端長久連接(表面上看起來是長久連接)的方式。
* HTTP long polling 是客戶端使用AJAX請求服務(wù)端時用到的一種服務(wù)端技術(shù)。是通過阻塞進(jìn)入的請求,直到當(dāng)前請求操作完成 來實現(xiàn)的。在HTTP中,這不是一種好的方式,因為HTTP的請求響應(yīng)模式不是為這種情形設(shè)計的。而且這也不是一種可靠的方式,可能會發(fā)生連接中斷的情況。
* WebSockets是一種新的支持雙工通信的技術(shù)。WebSockets使用一種特殊連接取代了客戶端/服務(wù)器模式的通信協(xié)議。
* 使用WebSockets是要考慮不支持HTML5的情況。使用??System.Web.HttpBrowserCapabilities 可以檢測。
* 基于WebSockets的通信一般包括三個步驟:
?① 通過一次握手在客戶端和服務(wù)端建立連接。
?② 請求WebSockets服務(wù)端開啟通信監(jiān)聽。
?③ 傳輸數(shù)據(jù)。
?請求WebSockets時,瀏覽器首先打開一個到服務(wù)端的http連接,然后瀏覽器發(fā)送一個升級版請求(如下),如該請求被接收并處理,則握手完成。所有通信通過一個TCP Socket連接進(jìn)行。
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實現(xiàn)一個客戶端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協(xié)議的建立,需要ASP.NET4.5及IIS8環(huán)境。?System.Web.WebSockets下的方法用來支持WebSockets相關(guān)的開發(fā)。
* 通過實現(xiàn)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時,要考慮如何處理連接意外關(guān)閉的情況。除了OnClose 和 OnError事件外,還需要更完善的處理,比如連接重建。
2.3 考慮何時使用WebSockets
當(dāng)需要跟服務(wù)端進(jìn)行雙工通信時,WebSockets是一個理想方案。
但是,也不是任何情況使用都是合適的。有些情況使用傳統(tǒng)的客戶端timer可能要更好一些。因為目前的HTML5還沒有完全普及。
另一種策略是在服務(wù)端設(shè)置一個開關(guān),可以決定是否使用WebSockets。讓服務(wù)端決定,可以簡化客戶端的代碼。
WebSockets不包含HTTP頭,但是卻以HTTP形式發(fā)送請求。這對于很多根據(jù)HTTP頭來監(jiān)測請求的地方來說,是一個潛在的威脅。是可能會被阻止的。而且這個阻止不能像瀏覽器是否支持HTML5那樣被檢測出來,只能是實際創(chuàng)建連接,發(fā)送數(shù)據(jù),然后根據(jù)返回結(jié)果來判斷。
3. 總結(jié)
① Http polling 是一種利用Javascript方法連續(xù)請求服務(wù)端來獲取數(shù)據(jù)的方式。雖然不是最高效的,但是具有廣泛的瀏覽器支持。(支持Js即可)
② Http long polling 是長連接方式,服務(wù)端收到請求后會保持連接,直到處理完成返回。然后客戶端收到返回并處理完成再進(jìn)行下一次連接。
③ WebSockets是一種在客戶端和服務(wù)器端提供雙工通信的方式。兩端可以同時互相通信。客戶端通過Http發(fā)送一個升級版請求到服務(wù)端,服務(wù)端收到后就會創(chuàng)建一個WebSockets連接。客戶端和服務(wù)端都需要寫代碼來通過socket進(jìn)行交互。
④ WebSockets適用于長時間的雙向通信情況。并不是所有情況都適用,尤其是不支持HTML5的情況。
轉(zhuǎn)載于:https://www.cnblogs.com/stone_lv/p/4789530.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的第六章 设计程序架构 之 设计实现WebSocket策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux安装VScode
- 下一篇: ROS环境下跑orb-slam2 单目相