亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

/// <summary>
        /// 返回?cái)z像頭信息
        /// </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("總共花費(fèi)時(shí)間:"+span.TotalSeconds.ToString()+"秒");
            this._videoSourceXmlString = xmlString;
            if (cameraDictionnary != null)
            {
                if (OnCamraInfoRcvCompleted != null) OnCamraInfoRcvCompleted(xmlString);
            }
        }

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

  當(dāng)然這種方式接收數(shù)據(jù)的缺點(diǎn)就是通過(guò)同步的方式,如果接收的數(shù)據(jù)太多的話,那么花費(fèi)的時(shí)間可能就過(guò)長(zhǎng)了,特別是在更新UI界面的時(shí)候,需要采用異步非阻塞的Socket來(lái)接收數(shù)據(jù)了,或者單獨(dú)來(lái)開(kāi)一個(gè)線程來(lái)進(jìn)行數(shù)據(jù)接收,然后通過(guò)Application.Current.Dispatcher.BeginInvoke的方式來(lái)更新到UI上面,不然界面就會(huì)卡死,這個(gè)需要我們?nèi)フJ(rèn)真分析......

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

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ù)后,通過(guò)XmlTextWriter寫(xiě)入到XML文件中時(shí),需要設(shè)置縮進(jìn)格式:xtw.Formatting = Formatting.Indented;這樣寫(xiě)入數(shù)據(jù)時(shí)數(shù)據(jù)就會(huì)完整,并且處于對(duì)齊方式。

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

相關(guān)文章

  • 5分鐘用C#實(shí)現(xiàn)串口助手

    5分鐘用C#實(shí)現(xiàn)串口助手

    本文主要介紹了C#實(shí)現(xiàn)串口助手,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C#中常用的正則表達(dá)式

    C#中常用的正則表達(dá)式

    本文主要介紹了C#中常用的正則表達(dá)式。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Asp.Net中避免重復(fù)提交和彈出提示框的實(shí)例代碼

    Asp.Net中避免重復(fù)提交和彈出提示框的實(shí)例代碼

    本文分為前臺(tái)和后臺(tái)代碼實(shí)現(xiàn)避免重復(fù)提交和彈出提示框效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下
    2017-02-02
  • C#鍵盤(pán)輸入回車(chē)鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法

    C#鍵盤(pán)輸入回車(chē)鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法

    這篇文章主要介紹了C#鍵盤(pán)輸入回車(chē)鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法,可實(shí)現(xiàn)用回車(chē)鍵代替點(diǎn)擊按鈕的功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • C#泛型和反射實(shí)例解析

    C#泛型和反射實(shí)例解析

    這篇文章主要介紹了C#泛型和反射實(shí)例解析,對(duì)于C#初學(xué)者理解泛型和反射有很好的幫助借鑒作用,需要的朋友可以參考下
    2014-08-08
  • WPF中使用WebView2控件的方法及常見(jiàn)問(wèn)題

    WPF中使用WebView2控件的方法及常見(jiàn)問(wèn)題

    WebView2為WPF網(wǎng)頁(yè)瀏覽工具,具有簡(jiǎn)單易用,頁(yè)面顯示清晰的優(yōu)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于WPF中使用WebView2控件的方法及常見(jiàn)問(wèn)題,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 找到整型陣列中最大值和最小值的幾種方法總結(jié)

    找到整型陣列中最大值和最小值的幾種方法總結(jié)

    下面小編就為大家分享一篇找到整型陣列中最大值和最小值的幾種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • C#檢測(cè)遠(yuǎn)程計(jì)算機(jī)端口是否打開(kāi)的方法

    C#檢測(cè)遠(yuǎn)程計(jì)算機(jī)端口是否打開(kāi)的方法

    這篇文章主要介紹了C#檢測(cè)遠(yuǎn)程計(jì)算機(jī)端口是否打開(kāi)的方法,實(shí)例分析了C#實(shí)現(xiàn)檢測(cè)遠(yuǎn)程端口開(kāi)啟的技巧,需要的朋友可以參考下
    2015-03-03
  • C#保存listbox中數(shù)據(jù)到文本文件的方法

    C#保存listbox中數(shù)據(jù)到文本文件的方法

    這篇文章主要介紹了C#保存listbox中數(shù)據(jù)到文本文件的方法,涉及C#操作listbox數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#使用TextBox作數(shù)據(jù)輸入方法

    C#使用TextBox作數(shù)據(jù)輸入方法

    筆者最近需要上位機(jī)與下位機(jī)進(jìn)行數(shù)據(jù)交互,在廣泛參考大佬的資料后,較為完善地使用Textbox控件進(jìn)行數(shù)據(jù)輸入的功能。感興趣的可以了解一下
    2021-06-06

最新評(píng)論