2013-08-06 67 views
0

我在上一個問題中獲得了關於如何發送圖像的幫助。 所做的事情是首先發送圖像的長度(大小),然後發送實際圖像,然後知道它何時完成。NetworkStream在我的代碼中我不明白

它看起來像這樣:

BinaryWriter writer = new BinaryWriter(netStream); 
while (someCondition) { 
    Image img = SomeImage(); 
    MemoryStream ms = new MemoryStream(); 
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
    byte[] buffer = new byte[ms.Length]; 
    ms.Seek(0, SeekOrigin.Begin); 
    ms.Read(buffer, 0, buffer.Length); 
    writer.Write(buffer.Length); 
    writer.Write(buffer); 

此代碼是:安傑洛Geels,誰在我剛纔的問題幫助了我。

現在,我試圖用某種方式來優化它。而且,它的工作原理。但只有當文件是BMP(未壓縮),我不知道爲什麼。

    using (MemoryStream ms = PrintWindow(process)) 
        { 
         writer.Write((int)ms.Length); 
         writer.Write(ms.GetBuffer()); 
        } 

因此PrintWindow將圖像保存到內存流並返回它。所以ms = memorystream與我的圖像在裏面。

因此,對於我來說,這應該是完美的,造成形式,我可以讓我做同樣的事情。

我發送文件的大小(內存流的長度)。 然後我發送字節[]數據在內存中。

所以,它是一樣的東西。

但是,它只適用於bmp。

我唯一能想到的是,當我以壓縮格式保存時,bmp首先被編寫,然後被編碼,這弄亂了getbuffer()或其他東西。

但我仍然認爲它應該工作。

+0

該代碼塊中缺少對使用情況的深刻關注。 – Xcelled194

回答

3

您編寫的字節太多,請使用Write()重載,以指定要寫入多少個數:

using (MemoryStream ms = PrintWindow(process)) { 
     writer.Write((int)ms.Length); 
     writer.Write(ms.GetBuffer(), 0, (int)ms.Length); 
    } 
+0

好,它的工作原理,這就是爲什麼我不必從它的外觀轉換爲字節數組。謝謝:) – Zerowalker

+0

順便說一句,有沒有辦法來優化它呢? 我的意思是,我必須在文件之前寫下文件的長度,所以它知道在哪裏結束。這有可能以某種方式改進嗎? – Zerowalker

+0

@ user2587718你永遠不會轉換爲一個字節數組。相反,你正在讀ms以外的塊,進入一個臨時緩衝區,然後寫入它。你擔心FAR過於關注「優化」,而你正在「優化」錯誤的東西。如果您遇到性能問題,請抓住分析器並查看它們的位置。如果他們確實在這段代碼中,那麼通過轉向本地語言,您將獲得更好的性能,而不是試圖從C#中獲得更多的好處。 – Xcelled194

2

請勿使用GetBuffer。從文檔:

請注意,該緩衝區包含可能未使用的分配的字節。 例如,如果將字符串「test」寫入到MemoryStream 對象中,則從GetBuffer返回的緩衝區的長度爲256,而不是 4,未使用252個字節。要僅獲取緩衝區中的數據,請使用ToArray方法 ;但是,ToArray會在內存中創建數據的副本。

用途:

writer.Write(ms.ToArray()); 

或者如果你是在4.0使用CopyTo方法:

ms.CopyTo(netStream); 

檢查這一點,如果你是不是在4.0的方式來複制流: How do I copy the contents of one stream to another?

+0

但是,它如何與bmp協同工作而不被壓縮? ToArray將創建一個副本(較慢?),然後GetBuffer? 試過了,它慢得多。在進程時間從2ms到12ms的時間裏,我會得到「Hickups」,GetBuffer總是0-2ms。 – Zerowalker

+0

@ user2587718基本上它純粹運氣。 GetBuffer和ToArray是**不可互換的。 – Xcelled194

+0

我在4.5,但是我可以直接寫網絡流的方式嗎?如何知道在沒有binaryreader/writer的情況下哪裏結束? – Zerowalker