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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第六章 设计程序架构 之 设计实现WebSocket策略

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第六章 设计程序架构 之 设计实现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策略的全部內容,希望文章能夠幫你解決所遇到的問題。

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