2010-11-10 53 views
0

我crteating客戶端服務器應用程序 和客戶端向服務器請求一個特定的圖像,並且服務器將其發送給客戶端字節的圖像轉換錯誤

當客戶接受它,它會顯示它在PictureBox

,所以這是我的代碼

string line = null; 
      line = textBox3.Text; 
      socket.Send(Encoding.ASCII.GetBytes(line)); 
      data = new byte[1024]; 
      dataSize = socket.Receive(data); 
      //string s = Encoding.ASCII.GetString(data, 0, dataSize); 
      //   textBox4.Text = s; 
      Image newImage; 
      using (MemoryStream ms = new MemoryStream(data,0,dataSize)) 
      { 

       ms.Write(data,0,dataSize); 

       newImage = Image.FromStream(ms,true); //HERE I GOT THE PROBLEM 

      } 


      pictureBox1.Image = newImage; 
     } 

然後返回稱爲一個錯誤,參數是無效的,所以我不知道自己做錯了什麼會在這裏?

+0

「它」根本不會「返回」錯誤。那裏的東西會引發一個異常,你應該做的第一件事是確定哪個函數拋出異常。除非您這樣做,否則可能會浪費數小時來查看錯誤的代碼。 – 2010-11-10 09:10:23

回答

0

你需要寫它後重置內存流的位置回到開始:

... 
ms.Write(data,0,dataSize); 
ms.Position = 0; 
newImage = Image.FromStream(ms,true); //HERE I GOT THE PROBLEM 
... 
+0

我得到了同樣的錯誤:S – nadeem 2010-11-10 07:42:36

0

嘗試在這個環節給出瞭解決方案:http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=799

+0

實際上,我使用這段代碼!,它給了我這個錯誤 – nadeem 2010-11-10 07:34:26

+0

但是他們在那段代碼中使用了Convert方法來轉換到MemoryStream,而你沒有使用它。 – 2010-11-10 08:44:44

2

很難相信像小於1KB在尺寸方面。有更大的緩衝區:

data = new byte[1024 * 500]; //limit to 500KB 

緩衝區小於圖像的實際大小可能會導致不完整的數據,這實際上是無效的圖像流。

+0

由於TCP不是基於數據包的協議,因此仍然無法正常工作。 – CodesInChaos 2010-11-10 09:17:37

0

您的網絡代碼是在兩個方面馬車:

1)如果數據> 1024個字節它不會在所有
2)工作,如果輸入的數據被割裂它的中斷(一個發送調用不做不映射到一個接收呼叫)。 TCP是一種不基於數據包的協議。

要修復它首先寫入圖像的字節大小,並在讀取讀取,直到您有足夠的字節,然後才從字節構造圖像。