问题描述
我是菜鸟,刚刚接触C#我想实现如下两项功能首先将内存中Bytes[]传过来的数据通过ICSharpCode.SharpZipLib.Zip进行压缩,存放在一个文件中。因为,过一段时间,Bytes[]传一次,每次大约1MB的数据量。其次,将压缩后的文件通过Socket实时发送给客户端。请问大侠们如何解决,在解决的过程中尽可能降低内存的使用量,和CPU的利用率。
解决方案
解决方案二:
byte[]压缩之后也还是byte[],这方面没什么不一样。既然你能够“传过来”,那么实现“返回给客户端”也不算什么事儿。至于应不应该在服务器端做这个(还是应该在客户端做?或者根本无需给客户端返回?)那是业务逻辑,从你的描述上看不出来。
解决方案三:
如果你只是别人告诉你说“ICSharpCode.SharpZipLib.Zip”这个名词儿你需要找代码,那么可以自己搜索,还是有很多例子的。这里没有什么设计技术,就是工人重复劳动。
解决方案四:
引用2楼sp1234的回复:
如果你只是别人告诉你说“ICSharpCode.SharpZipLib.Zip”这个名词儿你需要找代码,那么可以自己搜索,还是有很多例子的。这里没有什么设计技术,就是工人重复劳动。
首先,多谢您的回复,现在传来的数据每隔1s传来一次数据(Byte[]),每次1MB,虽然是Byte[]但是,他的数据太大,我需要进行压缩保存(存成一个文件“.dat”),同时在服务器端(压缩后)传送给客户端。我现在关于压缩和传送这块没有弄明白,应该如何处理,希望能提供一些代码实例。谢谢
解决方案五:
实在无法理解你为什么非要压缩后再存成文件再传……多此一举。压缩和socket传输都有现成例子,合在一起就好了
解决方案六:
引用4楼wjq的回复:
实在无法理解你为什么非要压缩后再存成文件再传……多此一举。压缩和socket传输都有现成例子,合在一起就好了
这样是为了节省磁盘空间和传送过程中减少占用网络资源的时间
解决方案七:
楼主选择了压缩功能,其实就是节省传输量,但浪费了CPU资源,这个取舍只能根据情况决定.1s传1M真是挺吓人的,不会搞错吧
解决方案八:
引用5楼HXWYL的回复:
Quote: 引用4楼wjq的回复:
实在无法理解你为什么非要压缩后再存成文件再传……多此一举。压缩和socket传输都有现成例子,合在一起就好了这样是为了节省磁盘空间和传送过程中减少占用网络资源的时间
那你浪费磁盘空间干什么?直接把压缩后的byte[]传过去就好了
解决方案九:
引用7楼wjq的回复:
Quote: 引用5楼HXWYL的回复:
Quote: 引用4楼wjq的回复:
实在无法理解你为什么非要压缩后再存成文件再传……多此一举。压缩和socket传输都有现成例子,合在一起就好了这样是为了节省磁盘空间和传送过程中减少占用网络资源的时间
那你浪费磁盘空间干什么?直接把压缩后的byte[]传过去就好了
存储在服务器是为了将来离线时,随时可拷贝此数据到任何一台操作员站上,而传送给操作员站的压缩数据在操作员站接收后并不保存,仅是显示后便可丢失。压缩问题已经解决了。
解决方案十:
引用6楼tcmakebest的回复:
楼主选择了压缩功能,其实就是节省传输量,但浪费了CPU资源,这个取舍只能根据情况决定.1s传1M真是挺吓人的,不会搞错吧
就是这个数据量
解决方案十一:
引用9楼HXWYL的回复:
Quote: 引用6楼tcmakebest的回复:
楼主选择了压缩功能,其实就是节省传输量,但浪费了CPU资源,这个取舍只能根据情况决定.1s传1M真是挺吓人的,不会搞错吧这个数据量是压缩前的,如果压缩后,应该在1Kb左右
解决方案十二:
不用存文件,中间用MemoryStream就行byte[]->MemoryStream->Zip(Stream)->Socket发送
解决方案十三:
引用11楼dongxinxi的回复:
不用存文件,中间用MemoryStream就行byte[]->MemoryStream->Zip(Stream)->Socket发送这是个好思路,可否给出一些代码?
解决方案十四:
如果你只是压缩一下,用Net自带的GZipStream就行了.Net4.0里也有封装好的ZIP压缩伪代码//using(varms=newMemoryStream(数据.Length))//如果套接字是流模式,直接写入数据发送,否则先压缩到ms,再发送using(varmyNetworkStream=newNetworkStream(socket)){using(varzipStream=newZipOutputStream(ms)){zipStream.SetLevel(压缩级别);zipStream.Write(数据,0,数据.Length);//socket.Send(zipStream...)}}解决方案十五:
using(varzipStream=newZipOutputStream(myNetworkStream))
解决方案:
引用13楼dongxinxi的回复:
如果你只是压缩一下,用Net自带的GZipStream就行了.Net4.0里也有封装好的ZIP压缩伪代码//using(varms=newMemoryStream(数据.Length))//如果套接字是流模式,直接写入数据发送,否则先压缩到ms,再发送using(varmyNetworkStream=newNetworkStream(socket)){using(varzipStream=newZipOutputStream(ms)){zipStream.SetLevel(压缩级别);zipStream.Write(数据,0,数据.Length);//socket.Send(zipStream...)}}我也将这两天在别人程序基础上修改的程序Copy过来,大家给看看。我刚刚开始学习c#,望各位大侠包含。我接收到的数据就是一个Byte数组,我需要实现的功能是,不断的压缩保存,同时不断将压缩后数据发送出去(通过Socket),现在压缩应该是实现了。Stopwatchsw=newStopwatch();sw.Start();while(nRead<nTotal){intnCount=PCI_Interface_GetFifoCntForRead(mHandle);if(nCount>READ_COUNT){PCI_Interface_ReadFifo(mHandle,Buffer,READ_COUNT);ZipHelp.Zip(Buffer,DateTime.Now.ToString("yyyy_MM_dd_hh-mm-ss.")+String.Format("{0:D3}",newRandom().Next(0,1000)),DateTime.Now.ToString("yyyy_MM_dd_hh-mm-ss.")+String.Format("{0:D3}",newRandom().Next(0,1000))+".wmj");nRead++;txtRecv.Text=nRead.ToString();Application.DoEvents();}else{//尚未达到读取数量,等待一段时间查询一次Thread.Sleep(1);}}sw.Stop();publicstaticvoidZip(byte[]ByteToZip,stringfilename,stringZipedFile){FileStreamZipFile=newFileStream(ZipedFile,FileMode.OpenOrCreate,FileAccess.Write);ZipOutputStreamZipStream=newZipOutputStream(ZipFile);ZipEntryZipEntry=newZipEntry(Path.GetFileName(filename));ZipStream.PutNextEntry(ZipEntry);ZipStream.SetLevel(9);try{ZipStream.Write(ByteToZip,0,ByteToZip.Length);}catch(System.Exceptionex){throwex;}ZipStream.Close();ZipFile.Close();}
时间: 2024-10-03 00:56:36