这期内容当中小编将会给大家带来有关如何在C#中使用Socket读取超大的数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
成都创新互联基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业服务器托管报价,主机托管价格性价比高,为金融证券行业成都IDC机房托管,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。////// 返回摄像头信息 /// 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 = ""; s += "\0"; byte[] buffer = System.Text.ASCIIEncoding.GetEncoding("GB2312").GetBytes(s); mysocket.Send(buffer); Action OnCamraInfoRcvCompleted = obj as Action ; int recvsize = 0; int dataSize = 2048 * 1000; int ret = 0; byte[] datas = new byte[dataSize]; SortedList cameraDictionnary = new SortedList (); 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读取超大的数据了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。