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

C# 通過Socket讀取大量數(shù)據(jù)的示例

 更新時間:2021年03月01日 11:32:56   作者:Hello——尋夢者!  
這篇文章主要介紹了C# 通過Socket讀取大量數(shù)據(jù)的示例,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下

  在C#中經常會用到Socket去接收和發(fā)送數(shù)據(jù),而且也是非常方便的,有時候我們會向服務端去請求數(shù)據(jù),如果返回的數(shù)據(jù)量很大,比如超過10M甚至是更多,那么該怎樣去接收數(shù)據(jù)呢?下面以一個在項目中用到的實例去分析和解釋這個問題,先看看下面的這段代碼?

/// <summary>
        /// 返回攝像頭信息
        /// </summary>
        private void RcvCameraInfos(object obj)
        {
            string sourceIp = System.Configuration.ConfigurationSettings.AppSettings["SourceIP"].ToString();
            string sourcePort = System.Configuration.ConfigurationSettings.AppSettings["SourcePort"].ToString();
 
            Socket mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(sourceIp), int.Parse(sourcePort));
            mysocket.Connect(ipEndPoint);
 
            DateTime start = DateTime.Now;
 
            string s = "<?xml version=\"1.0\" ?>";
            s += "<info  name=\"getcameracodematrixtable\"/>\0";
            byte[] buffer = System.Text.ASCIIEncoding.GetEncoding("GB2312").GetBytes(s);
            mysocket.Send(buffer);
 
            Action<string> OnCamraInfoRcvCompleted = obj as Action<string>;
             
            int recvsize = 0;
            int dataSize = 2048 * 1000;
            int ret = 0;
            byte[] datas = new byte[dataSize];
            SortedList<string, string[]> cameraDictionnary = new SortedList<string, string[]>();
            string xmlString = "";
            while (recvsize < dataSize)
            {
                ret = mysocket.Receive(datas, recvsize, dataSize - recvsize, SocketFlags.None);
                if (ret <= 0)
                {                   
                    break;
                }                  
                recvsize += ret;
                if (datas[recvsize - 1] == 0)
                {                   
                    break;
                }
                if (recvsize >= dataSize)
                {
                    byte[] buff2 = new byte[dataSize + 1024];
                    datas.CopyTo(buff2,0);
                    datas = buff2;
                    dataSize += 1024;               
                }
            }
            xmlString = System.Text.ASCIIEncoding.GetEncoding("GB2312").GetString(datas, 0, recvsize - 1);
            DateTime end = DateTime.Now;
            TimeSpan span = end - start;
            System.Windows.MessageBox.Show("總共花費時間:"+span.TotalSeconds.ToString()+"秒");
            this._videoSourceXmlString = xmlString;
            if (cameraDictionnary != null)
            {
                if (OnCamraInfoRcvCompleted != null) OnCamraInfoRcvCompleted(xmlString);
            }
        }

  上述這段代碼的核心是在While循環(huán)里面,我們首先接收的BufferSize,這里我們定義2048*1000個字節(jié)的大小,ret = mysocket.Receive(datas, recvsize, dataSize - recvsize, SocketFlags.None);通過Socket的這個同步方法來進行接收,datas是我們接收數(shù)據(jù)的Byte數(shù)組,recvsize是當前接收的字節(jié)起點(offset),dataSize-recvsize是接收的緩沖區(qū)大小,在這個While循環(huán)里面,只要是recvsize < dataSize就會不停的去接收數(shù)據(jù),當然如果數(shù)據(jù)量很大的話總有一個時刻recvsize >= dataSize,這個時候我怎就需要增加dataSize了,這里我們去動態(tài)增加1KB的大小,通過這樣一個邊界控制我們就能夠去準確獲取所有的數(shù)據(jù)了......

  當然這種方式接收數(shù)據(jù)的缺點就是通過同步的方式,如果接收的數(shù)據(jù)太多的話,那么花費的時間可能就過長了,特別是在更新UI界面的時候,需要采用異步非阻塞的Socket來接收數(shù)據(jù)了,或者單獨來開一個線程來進行數(shù)據(jù)接收,然后通過Application.Current.Dispatcher.BeginInvoke的方式來更新到UI上面,不然界面就會卡死,這個需要我們去認真分析......

  另外一個當我們這樣接收數(shù)據(jù)然后存入XML文件時,可能XML數(shù)據(jù)都是連在一起并不能主動換行,這個可以通過下面的方式來解決。

private void SaveCurrentInfoToXML(string recevInfo)
       {
           string filePath=System.AppDomain.CurrentDomain.BaseDirectory+"CameraInfo.xml";
           XmlDocument xd = new XmlDocument();
           if (File.Exists(filePath))
           {
               xd.Load(filePath);              
           }
           else
           {
               XmlDeclaration xmlDec;
               XmlElement xmlEle;
               xmlDec = xd.CreateXmlDeclaration("1.0","UTF-8",null);
               xd.AppendChild(xmlDec);
               xmlEle = xd.CreateElement("Info");
               xd.AppendChild(xmlEle);
           }
           xd.LoadXml(recevInfo);
           XmlTextWriter xtw = new XmlTextWriter(filePath, Encoding.UTF8);
           xtw.Formatting = Formatting.Indented;
           xd.Save(xtw);
            
            
       }

  這里我們接收到XML數(shù)據(jù)后,通過XmlTextWriter寫入到XML文件中時,需要設置縮進格式:xtw.Formatting = Formatting.Indented;這樣寫入數(shù)據(jù)時數(shù)據(jù)就會完整,并且處于對齊方式。

以上就是C# 通過Socket讀取大量數(shù)據(jù)的示例的詳細內容,更多關于C# 通過Socket讀取數(shù)據(jù)的資料請關注腳本之家其它相關文章!

相關文章

  • C#將字節(jié)數(shù)組轉換成數(shù)字的方法

    C#將字節(jié)數(shù)組轉換成數(shù)字的方法

    這篇文章主要介紹了C#將字節(jié)數(shù)組轉換成數(shù)字的方法,涉及C#類型轉換的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C#使用符號表實現(xiàn)查找算法

    C#使用符號表實現(xiàn)查找算法

    本文詳細講解了C#使用符號表實現(xiàn)查找算法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#泛型相關講解

    C#泛型相關講解

    我們在編寫程序時,經常 遇到兩個模塊的功能非常相似,只是一個是處理int數(shù)據(jù),另一個是處理string數(shù)據(jù),或者其他自定義的數(shù)據(jù)類型
    2013-05-05
  • C#數(shù)組中List, Dictionary的相互轉換問題

    C#數(shù)組中List, Dictionary的相互轉換問題

    這篇文章主要介紹了C#數(shù)組中List, Dictionary的相互轉換問題,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • C#實現(xiàn)數(shù)據(jù)導出任一Word圖表的通用呈現(xiàn)方法

    C#實現(xiàn)數(shù)據(jù)導出任一Word圖表的通用呈現(xiàn)方法

    應人才測評產品的需求,導出測評報告是其中一個重要的環(huán)節(jié),報告的文件類型也多種多樣,其中WORD輸出也扮演了一個重要的角色,本文給大家介紹了C#實現(xiàn)數(shù)據(jù)導出任一Word圖表的通用呈現(xiàn)方法及一些體會,需要的朋友可以參考下
    2023-10-10
  • C# 表達式目錄樹Expression的實現(xiàn)

    C# 表達式目錄樹Expression的實現(xiàn)

    本文主要介紹了C# 表達式目錄樹Expression的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C#執(zhí)行系統(tǒng)命令的方法

    C#執(zhí)行系統(tǒng)命令的方法

    這篇文章主要介紹了C#執(zhí)行系統(tǒng)命令的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • unity實現(xiàn)多點觸控代碼

    unity實現(xiàn)多點觸控代碼

    這篇文章主要介紹了unity實現(xiàn)多點觸控代碼,我最近在學習Unity游戲引擎。先從Unity平面開始,本章介紹Unity 平面上的多點觸摸。有需要的小伙伴參考下。
    2015-03-03
  • C#各種異常處理方式總結

    C#各種異常處理方式總結

    這篇文章介紹了C#各種異常的處理方式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C#多線程之線程同步

    C#多線程之線程同步

    這篇文章介紹了C#多線程之線程同步,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論

稷山县| 双流县| 宜昌市| 屏东县| 巴楚县| 婺源县| 同心县| 临颍县| 三江| 化隆| 浦县| 巴彦县| 喜德县| 利川市| 武清区| 当涂县| 临桂县| 敦煌市| 霍林郭勒市| 襄汾县| 扎赉特旗| 新安县| 双峰县| 铜梁县| 神农架林区| 永宁县| 安西县| 南召县| 锡林浩特市| 额尔古纳市| 海兴县| 平南县| 集贤县| 谢通门县| 循化| 阿合奇县| 南溪县| 南通市| 全州县| 昌黎县| 寻乌县|