2015-08-27 70 views
0

我試着在發送對象(在我的情況的圖像)一個的NetworkStream .. however- IM沒有得到完整的圖像..C#讀取從的NetworkStream

這是客戶端代碼:

private void Form1_Load(object sender, EventArgs e) 
    { 


     TcpClient c = new TcpClient(); 
     c.Connect("10.0.0.4", 10); 
     NetworkStream ns = c.GetStream(); 

     Bitmap f = GetDesktopImage(); 
     byte[] buffer = imageToByteArray(f); 
     byte[] len = BitConverter.GetBytes(buffer.Length);   
     MemoryStream stream = new MemoryStream(); 
      stream.Write(len, 0, len.Length); 
      stream.Write(buffer, 0, buffer.Length); 
      stream.Position = 0; 
      stream.CopyTo(ns); 

    } 

正如你可以看到我的全部內容寫入到正規的MemoryStream第一(因爲我不想使用兩次NetworkStream - 只有到那時,我複製MemoryStream內容到NetworkStream

的服務器代碼:

private void Form1_Load(object sender, EventArgs e) 
    { 
     TcpListener tl = new TcpListener(IPAddress.Any, 10); 
     tl.Start(); 
     TcpClient c = tl.AcceptTcpClient(); 
      network = new NetworkStream(c.Client); 

      byte[] buff = new byte[4]; 
      network.Read(buff, 0, 4); 
      int len = BitConverter.ToInt32(buff, 0); 

      buff = new byte[len]; 
      network.Read(buff, 0, buff.Length); 
      pictureBox1.Image = byteArrayToImage(buff); 
      Thread th = new Thread(method); 


    } 

現在,當我運行兩個應用IM只得到所拍攝的圖像的上半部分......它甚至更奇怪,因爲既直接寫入到網絡流完美的作品...例如:

ns.Write(len, 0, len.Length); 
    ns.Write(buffer, 0, buffer.Length); 

這將很好地工作,我會得到對方的全部圖像..但我不想使用它的兩倍(這只是一個例子,在我真正的項目中,我將不得不使用它很多,所以我想盡可能減少網絡使用率,並且不會爲每一個數據觸發它)。

爲什麼它不能使用簡單的CopyTo方法?

我將不勝感激任何幫助!

感謝

+0

'network.Read(淺黃色,0,buff.Length);'不必讀取'buff.Length'字節。檢查其返回值,並繼續閱讀,直到你閱讀'len'字節.. – Eser

回答

0

在服務器代碼被您忽略的NetworkStream.Read的結果是讀取的字節的實際數量。這可能是少於比您實際請求的字節數。您需要繼續調用Read,直到您收到所有需要的字節。

您在1次或多次寫入之間看到的差異與網絡堆棧中的緩衝/定時有關。我懷疑你做單一寫作時會很幸運地收到圖像 - 這並非總是如此!如上所述,您需要需要來處理Read的結果。

代碼示例:

void ReadBuffer(byte[] buffer, int offset, int count) 
{ 
    int num; 
    int num2 = 0; 
    do 
    { 
     num2 += num = _stream.Read(buffer, offset + num2, count - num2); 
    } 
    while ((num > 0) && (num2 < count)); 
    if (num2 != count) 
     throw new EndOfStreamException 
      (String.Format("End of stream reached with {0} bytes left to read", count - num2)); 
    } 
+0

好吧..買我可以問你爲什麼當我直接寫入網絡流它只是無意識地閱讀整個內容? @Kevin – Slashy

相關問題