最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Websocket連接實現(xiàn)wss協(xié)議

 更新時間:2022年05月25日 15:15:13   作者:無熵~  
本文主要介紹了C# Websocket連接實現(xiàn)wss協(xié)議,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、什么是Websocket?

1.WebSocket是HTML5下一種新的協(xié)議(websocket協(xié)議本質(zhì)上是一個基于tcp的協(xié)議)
2.它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達到實時通訊的目的
3.Websocket是一個持久化的協(xié)議

二、Websocket、Socket、Http、Mqtt之間的區(qū)別?

Socket:

Socket是對tcp/ip協(xié)議族的封裝的接口,Socket連接可以指定不同的傳輸層協(xié)議,即TCP或UDP,由于它是基于tcp/ip的,所以一般用在局域網(wǎng)內(nèi)通信。

WebSocket:

WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議,和http協(xié)議一樣屬于應(yīng)用層協(xié)議,是一種讓客戶端和服務(wù)器之間能進行雙向?qū)崟r通信(全雙工)的技術(shù),且支持長連接,可以進行互聯(lián)網(wǎng)間通信。引入ws和wss分別代表明文和密文的websocket協(xié)議,且默認端口使用80或443,幾乎與http一致,WebSocket也要有一個握手過程,然后才能正式收發(fā)數(shù)據(jù),由于數(shù)據(jù)包頭部協(xié)議較小,不同于http每次請求需要攜帶完整的頭部,所以網(wǎng)絡(luò)開銷比較少,長連接也讓延遲明顯更少(不需要重復(fù)新建連接)。

MQTT:

MQTT協(xié)議是為大量計算能力有限,且工作在低帶寬、不可靠的網(wǎng)絡(luò)的遠程傳感器和控制設(shè)備通訊而設(shè)計的協(xié)議,它具有以下主要的幾項特性:
1.使用發(fā)布/訂閱消息模式,提供一對多的消息發(fā)布,解除應(yīng)用程序耦合;
2.對負載內(nèi)容屏蔽的消息傳輸;
3.使用 TCP/IP 提供網(wǎng)絡(luò)連接;

HTTP:

HTTP是一個屬于應(yīng)用層的,基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。

通信方式:

1.瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送請求。Web服務(wù)器根據(jù)接收到的請求后,向客戶端發(fā)送響應(yīng)信息。
2.HTTP之請求消息Request:請求行(request line)、請求頭部(header)、空行和請求數(shù)據(jù)四個部分組成。
3.HTTP之響應(yīng)消息Response:HTTP響應(yīng)也由四個部分組成,分別是:狀態(tài)行、消息報頭、空行和響應(yīng)正文。
若connection 模式為close,則服務(wù)器會主動關(guān)閉TCP連接,客戶端被動關(guān)閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內(nèi)可以繼續(xù)接收請求;

三、WS和WSS協(xié)議

WS協(xié)議和WSS協(xié)議兩個均是WebSocket協(xié)議的SCHEM,兩者一個是非安全的,一個是安全的。也是統(tǒng)一的資源標志符。就好比HTTP協(xié)議和HTTPS協(xié)議的差別。非安全的沒有證書,安全的需要SSL證書。(SSL是Netscape所研發(fā),用來保障網(wǎng)絡(luò)中數(shù)據(jù)傳輸?shù)陌踩?,主要是運用數(shù)據(jù)加密的技術(shù),能夠避免數(shù)據(jù)在傳輸過程被不被竊取或者監(jiān)聽。)其中WSS表示在TLS之上的WebSocket。WS一般默認是80端口,而WSS默認是443端口,大多數(shù)網(wǎng)站用的就是80和433端口。(在高防防護過程中,80和433端口的網(wǎng)站是需要備案才可以接入國內(nèi)的。)當然網(wǎng)站也會有別的端口,這種如果做高防是方案是可以用海外高防的。WS和WSS的體現(xiàn)形式分別是TCP+WS AS WS ,TCP+TLS+WS AS WS。服務(wù)器網(wǎng)址就是 URL。最后墨者安全再說下WebSocket協(xié)議的特點:建立在 TCP 協(xié)議之上,服務(wù)端實現(xiàn)容易;與 HTTP 協(xié)議有良好的兼容性,握手時不容易被屏蔽,可以通過各種 HTTP 代理服務(wù)器;數(shù)據(jù)輕量,實時通訊;可以發(fā)送文本和二進制數(shù)據(jù)。不限制同源,客戶端可以與任意服務(wù)器端進行通訊。因此WebSocket協(xié)議的出現(xiàn),為很多人解決了關(guān)于擴展以及兼容性協(xié)議的煩惱問題。

WSS連接:由于wss是基于SSL,所以需要進行雙向驗證,客戶端連接服務(wù)端時,我需要添加證書(服務(wù)端不驗證可以不添加),服務(wù)端進行驗證。注意:客戶也需要對服務(wù)端進行驗證,所以需要添加服務(wù)端證書回調(diào),進行驗證,這是很多人忽視,所以出現(xiàn)無法連接遠程服務(wù)器,TLS/SSL驗證失敗的提示。

        public MainWindow()
        {
            InitializeComponent();
            RemoteCertificateValidationCallback remote = ValidateServerCertificate;
            ServicePointManager.ServerCertificateValidationCallback = remote;
        }
        /// <summary>
        /// 服務(wù)端驗證
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        public bool ValidateServerCertificate( object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
        {
            return   true ;
        }        
        /// <summary>
        /// WebSocket客戶端連接
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public async Task Connect()
        {
            CancellationTokenSource t = new CancellationTokenSource();
            try
            {
                client.Options.SetRequestHeader("key", "value");
                X509Certificate2 cert = new X509Certificate2("xxx.cert");
                client.Options.ClientCertificates.Add(cert);
                Uri uri = new Uri("wss://xxxxxx");
                //var config=new ServerConfig
                await client.ConnectAsync(uri, t.Token);
                Thread.Sleep(300);
                Console.WriteLine($"鏈接websocket:[{uri}] 完成");
                Task s1 = new Task(Receive, t, t.Token, TaskCreationOptions.LongRunning);
                s1.Start();
                token = t;
                Console.WriteLine("Send Hello");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"鏈接websocket:[{uri}] 失敗", ex.Message);
 
            }
        }
        /// <summary>
        /// Websocket接收
        /// </summary>
        /// <param name="obj"></param>
        private void Receive(object obj)
        {
            CancellationTokenSource ts = obj as CancellationTokenSource;
            byte[] bs = new byte[1024];
            while (!ts.Token.IsCancellationRequested)
            {
                try
                {
                    ArraySegment<byte> buff = new ArraySegment<byte>(bs, 0, bs.Length);
                    Task<WebSocketReceiveResult> res = client.ReceiveAsync(buff, ts.Token);
                    res.Wait();
                    if (ts.Token.IsCancellationRequested)
                    {
                        return;
                    }
                    if (WebSocketCloseStatus.NormalClosure == res.Result.CloseStatus)
                    {
                        Console.WriteLine($"websocket:與服務(wù)器斷開鏈接:{res.Result.CloseStatus} --> Desc :{res.Result.CloseStatusDescription}");
                        ts.Cancel();
                        return;
                    }
                    string strData = encod.GetString(bs, 0, res.Result.Count);
                    Console.WriteLine(strData);
                    WsMsg msg = WsMsg.Deserialize(strData);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("解析或執(zhí)行 websocket:命令失敗", ex);
                }
            }
        }

Websocket客戶端與服務(wù)端通信代碼參考文章:

WebSocket協(xié)議:5分鐘從入門到精通 - 程序猿小卡  https://www.cnblogs.com/chyingp/p/websocket-deep-in.html

C# WebSocket_熊思雨的博客 https://blog.csdn.net/qq_38693757/article/details/114933642

C# WebSocket - 南國葉子 https://www.cnblogs.com/nanguoyezi/p/9351555.html

到此這篇關(guān)于C# Websocket連接實現(xiàn)wss協(xié)議的文章就介紹到這了,更多相關(guān)C# Websocket連接wss內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# List引用類型克隆的3種方法

    C# List引用類型克隆的3種方法

    這篇文章主要給大家介紹了關(guān)于C# List引用類型克隆的3種方法,包括反射、序列化(依賴Newtonsoft.Json) 以及序列化(BinaryFormatter)的實現(xiàn)方法,需要的朋友可以參考借鑒,下面來一起看看吧
    2019-01-01
  • CefSharp如何進行頁面的縮放(Ctrl+滾輪)

    CefSharp如何進行頁面的縮放(Ctrl+滾輪)

    CefSharp簡單來說就是一款.Net編寫的瀏覽器包,本文主要介紹了CefSharp如何進行頁面的縮放,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C#構(gòu)造函數(shù)詳解

    C#構(gòu)造函數(shù)詳解

    本文詳細講解了C#中的構(gòu)造函數(shù),文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#從文件流讀取xml文件到DataSet并顯示的方法

    C#從文件流讀取xml文件到DataSet并顯示的方法

    這篇文章主要介紹了C#從文件流讀取xml文件到DataSet并顯示的方法,實例分析了C#操作XML文件的技巧與DataSet的使用方法,需要的朋友可以參考下
    2015-04-04
  • C#文字換行的實現(xiàn)方法

    C#文字換行的實現(xiàn)方法

    這篇文章主要介紹了C#文字換行的實現(xiàn)方法,通過自定義函數(shù)實現(xiàn)針對特定字符串的換行長度處理,是比較實用的技巧,對于C#的深入學(xué)習(xí)具有一定的借鑒價值,需要的朋友可以參考下
    2014-12-12
  • C#實現(xiàn)在前端網(wǎng)頁彈出警告對話框(alert)的方法

    C#實現(xiàn)在前端網(wǎng)頁彈出警告對話框(alert)的方法

    這篇文章主要介紹了C#實現(xiàn)在前端網(wǎng)頁彈出警告對話框(alert)的方法,涉及C#通過自定義函數(shù)調(diào)用window.alert方法彈出對話框的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 淺談C#中的for循環(huán)與foreach循環(huán)

    淺談C#中的for循環(huán)與foreach循環(huán)

    本篇文章主要介紹了C#中的for循環(huán)與foreach循環(huán)的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • 基于WPF實現(xiàn)3D畫廊動畫效果的示例代碼

    基于WPF實現(xiàn)3D畫廊動畫效果的示例代碼

    這篇文章主要為大家詳細介紹了如何基于WPF實現(xiàn)簡單的3D畫廊動畫效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • 快速學(xué)習(xí)C# 設(shè)計模式之職責鏈模式

    快速學(xué)習(xí)C# 設(shè)計模式之職責鏈模式

    這篇文章主要介紹了C# 設(shè)計模式之職責鏈模式的的相關(guān)資料,文中代碼非常細致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C#實現(xiàn)定時關(guān)機小應(yīng)用

    C#實現(xiàn)定時關(guān)機小應(yīng)用

    這篇文章主要為大家詳細介紹了C#實現(xiàn)定時關(guān)機小應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評論

辉县市| 青州市| 玛曲县| 贺州市| 寿宁县| 忻州市| 泰来县| 清河县| 广汉市| 固镇县| 大港区| 镇平县| 平罗县| 昆明市| 洪雅县| 明水县| 开远市| 宁乡县| 屏山县| 页游| 博爱县| 旬阳县| 岱山县| 越西县| 乌审旗| 宁国市| 习水县| 县级市| 山西省| 建瓯市| 察雅县| 仪征市| 莱州市| 甘洛县| 张家界市| 商都县| 玉龙| 根河市| 微博| 裕民县| 隆德县|