C# 通过Socket读取大量数据的示例
在C#中经常会用到Socket去接收和发送数据,而且也是非常方便的,有时候我们会向服务端去请求数据,如果返回的数据量很大,比如超过10M甚至是更多,那么该怎样去接收数据呢?下面以一个在项目中用到的实例去分析和解释这个问题,先看看下面的这段代码?
//////返回摄像头信息 /// privatevoidRcvCameraInfos(objectobj) { stringsourceIp=System.Configuration.ConfigurationSettings.AppSettings["SourceIP"].ToString(); stringsourcePort=System.Configuration.ConfigurationSettings.AppSettings["SourcePort"].ToString(); Socketmysocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPointipEndPoint=newIPEndPoint(IPAddress.Parse(sourceIp),int.Parse(sourcePort)); mysocket.Connect(ipEndPoint); DateTimestart=DateTime.Now; strings=""; s+="\0"; byte[]buffer=System.Text.ASCIIEncoding.GetEncoding("GB2312").GetBytes(s); mysocket.Send(buffer); Action OnCamraInfoRcvCompleted=objasAction ; intrecvsize=0; intdataSize=2048*1000; intret=0; byte[]datas=newbyte[dataSize]; SortedList cameraDictionnary=newSortedList (); stringxmlString=""; while(recvsize =dataSize) { byte[]buff2=newbyte[dataSize+1024]; datas.CopyTo(buff2,0); datas=buff2; dataSize+=1024; } } xmlString=System.Text.ASCIIEncoding.GetEncoding("GB2312").GetString(datas,0,recvsize-1); DateTimeend=DateTime.Now; TimeSpanspan=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
当然这种方式接收数据的缺点就是通过同步的方式,如果接收的数据太多的话,那么花费的时间可能就过长了,特别是在更新UI界面的时候,需要采用异步非阻塞的Socket来接收数据了,或者单独来开一个线程来进行数据接收,然后通过Application.Current.Dispatcher.BeginInvoke的方式来更新到UI上面,不然界面就会卡死,这个需要我们去认真分析......
另外一个当我们这样接收数据然后存入XML文件时,可能XML数据都是连在一起并不能主动换行,这个可以通过下面的方式来解决。
privatevoidSaveCurrentInfoToXML(stringrecevInfo) { stringfilePath=System.AppDomain.CurrentDomain.BaseDirectory+"CameraInfo.xml"; XmlDocumentxd=newXmlDocument(); if(File.Exists(filePath)) { xd.Load(filePath); } else { XmlDeclarationxmlDec; XmlElementxmlEle; xmlDec=xd.CreateXmlDeclaration("1.0","UTF-8",null); xd.AppendChild(xmlDec); xmlEle=xd.CreateElement("Info"); xd.AppendChild(xmlEle); } xd.LoadXml(recevInfo); XmlTextWriterxtw=newXmlTextWriter(filePath,Encoding.UTF8); xtw.Formatting=Formatting.Indented; xd.Save(xtw); }
这里我们接收到XML数据后,通过XmlTextWriter写入到XML文件中时,需要设置缩进格式:xtw.Formatting=Formatting.Indented;这样写入数据时数据就会完整,并且处于对齐方式。
以上就是C#通过Socket读取大量数据的示例的详细内容,更多关于C#通过Socket读取数据的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。