2012-11-10 18 views
1

好的,所以我看到多個人遇到這個問題,並且我在某種程度上發現了可能導致問題的原因,但我無法弄清楚如何修復它。基本上,我試圖通過套接字從客戶端向服務器發送截圖。我把客戶端應用程序的屏幕截圖和使用此方法將其轉換爲一個字節數組:System.Drawing.ImageFromStream中的System.ArgumentException

// Convert bitmap to byte method 
public static byte[] ImageToByte(Bitmap bitmap) 
{ 
    byte[] imageData; 
    using (var stream = new MemoryStream()) 
    { 
     bitmap.Save(stream, ImageFormat.Png); 
     imageData = stream.ToArray(); 
     return imageData; 
    } 
} 

我然後發送字節數組的長度和字節數組到服務器。服務器,接收長度後,使用此方法獲取的實際數據(這是該方法的一部分,因爲其中大部分是不相關的):

void dataRecieveCallback(IAsyncResult ar) 
{ 
    try 
    { 
     int rec = sck.EndReceive(ar); 

     if (rec <= 0) 
     { 
      return; 
     } 

     recieveBuffer.bufStream.Write(recieveBuffer.buffer, 0, rec); 
     recieveBuffer.toRecieve -= rec; 

     if (recieveBuffer.toRecieve > 0) 
     { 
      Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length); 
      recieveBuffer.bufStream.Position = 0; 
      sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null); 
      return; 
     } 

     // Convert all recieved data in memory stream to a byte array 
     byte[] finalBuffer = recieveBuffer.bufStream.ToArray(); 

我然後用finalBuffer來嘗試獲得形象,但每當我做的,使用這種方法:

 TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); 
     Bitmap screenShot = (Bitmap)tc.ConvertFrom(finalBuffer); 

我總是System.ArgumentExceptionSystem.Drawing.ImageFromStream得到:「參數是無效的」。這段代碼在發送字符串方面效果很好,但每當我嘗試發送圖像時都不起作用。我非常確定這是套接字代碼的問題,因爲我嘗試了一下屏幕截圖,使用相同的方法將其轉換爲字節數組,然後使用相同的方法將其轉換回來,然後運行。有人知道我的代碼在這裏有什麼問題嗎?

下面是代碼的一部分用於緩衝

struct RecBuffer 
{ 
    public const int BUFFER_SIZE = 1024; 
    public byte[] buffer; 
    public int toRecieve; 
    public MemoryStream bufStream; 

    public RecBuffer(int toRec) 
    { 
     buffer = new byte[BUFFER_SIZE]; 
     toRecieve = toRec; 
     bufStream = new MemoryStream(toRecieve); 
    } 
} 

我用相當多的代碼從this tutorial。至少在接收部分。

+0

你調試了finalBuffer Byte [],看看它們是否與源字節[]匹配?至少可以比較長度和第一個字節。您的接收方法看起來很奇怪。這個rec​​ieveBuffer是什麼類? – KroaX

+0

對不起,我應該發佈更多的代碼。 recieveBuffer的代碼如下所示:struct RecBuffer { public const int BUFFER_SIZE = 1024; public byte [] buffer; public int toRecieve; public MemoryStream bufStream; public RecBuffer(int toRec) { buffer = new byte [BUFFER_SIZE]; toRecieve = toRec; bufStream = new MemoryStream(toRecieve); }'我使用了很多這些傢伙代碼:http://www.youtube.com/watch?v=PCwS7F2uK3Q – user1742916

+0

我把這段代碼放到你原來的帖子中。這樣就不能正確讀取。那麼你是否已經檢查了接收字節[]? – KroaX

回答

1

我認爲問題出在您的dataRecieveCallback函數。 有你的bufStream的位置重置爲零:

if (recieveBuffer.toRecieve > 0) 
{ 
    Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length); 
    recieveBuffer.bufStream.Position = 0; // <--Here 
    sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null); 
    return; 
} 

這意味着您覆蓋下一次 系統調用回調函數已經接收的字節。

所以,僅僅刪除行

recieveBuffer.bufStream.Position = 0; 

,你的代碼應該很好地工作。

+0

非常感謝!我感到非常愚蠢,因爲沒有刪除它,這是在示例代碼中,我基於這一部分,我只是沒有多少考慮。 – user1742916

+0

@ user1742916:您的歡迎!請點擊投票箭頭下面的空心檢查標記接受我的回答。 – Hans

相關問題