91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在C#中使用Socket讀取超大的數據

發布時間:2021-03-01 16:35:09 來源:億速云 閱讀:231 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關如何在C#中使用Socket讀取超大的數據,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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

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

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

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數據后,通過XmlTextWriter寫入到XML文件中時,需要設置縮進格式:xtw.Formatting = Formatting.Indented;這樣寫入數據時數據就會完整,并且處于對齊方式。

上述就是小編為大家分享的如何在C#中使用Socket讀取超大的數據了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芷江| 东丽区| 霞浦县| 吉水县| 徐水县| 天全县| 京山县| 会宁县| 富蕴县| 西乌珠穆沁旗| 柏乡县| 邹城市| 伊春市| 肇庆市| 白银市| 河东区| 宁都县| 林州市| 永丰县| 玉山县| 哈尔滨市| 永城市| 襄樊市| 巴中市| 民勤县| 泌阳县| 大庆市| 泸水县| 大化| 武鸣县| 汾阳市| 格尔木市| 全州县| 囊谦县| 西宁市| 芜湖市| 丹东市| 郯城县| 东兰县| 右玉县| 铜鼓县|