2012-07-31 175 views
0

我使用TCP套接字發送和接收圖像,但接收代碼無效。C#發送/接收字節大小的問題(套接字)

這是發送代碼

public void SendImage() 
{ 
    int ScreenWidth = Screen.GetBounds(new Point(0, 0)).Width; 
    int ScreenHeight = Screen.GetBounds(new Point(0, 0)).Height; 
    Bitmap bmpScreenShot = new Bitmap(ScreenWidth, ScreenHeight); 

    Graphics gfx = Graphics.FromImage((Image)bmpScreenShot); 
    gfx.CopyFromScreen(0, 0, 0, 0, new Size(ScreenWidth, ScreenHeight)); 
    bmpScreenShot.Save(Application.StartupPath + "/ScreenShot.jpg", ImageFormat.Jpeg); 
    byte[] image = new byte[1]; 
    bmpScreenShot = ResizeBitmap(bmpScreenShot, 300, 300); 

    image = ImageToByte(bmpScreenShot); 
    //get the length of image (length of bytes) 
    int NumberOfBytes = image.Length; 
    //put the size into a byte array 
    byte[] numberofbytesArray = BitConverter.GetBytes(NumberOfBytes); 

    //send the size to the Client 
    int sizesend = sck.Send(numberofbytesArray, 0, numberofbytesArray.Length, 0); 
    if (sizesend > 0) 
    { 
     MessageBox.Show("Size Sent"); 
    } 
    //send the image to the Client 
    int imagesend =sck.Send(image, 0, NumberOfBytes, 0); 
    if (imagesend > 0) 
    { 
     MessageBox.Show("Image Sent"); 
    } 
} 

這裏是接收代碼

public void ReceiveImage() 
{ 
    if (sck.Connected) 
    { 
     { 
      NetworkStream stream = new NetworkStream(sck); 
      byte[] data = new byte[4]; 

      //Read The Size 
      stream.Read(data, 0, data.Length); 
      int size = (BitConverter.ToInt32(data,0)); 
      // prepare buffer 
      data = new byte[size]; 

      //Load Image 
      int read = 0; 
      while (read != data.Length) 
      { 
       read += stream.Read(data, read, data.Length - read); 
      } 
      //stream.Read(data, 0, data.Length); 
      //Convert Image Data To Image 
      MemoryStream imagestream = new MemoryStream(data); 
      Bitmap bmp = new Bitmap(imagestream); 
      pictureBox1.Image = bmp;      
     } 
    } 
} 

問題是,當我發送的大小,其作爲5KB,但是當發我收到它,我發現它2GB和這個錯誤出現:

無法從傳輸連接讀取數據。可以執行套接字操作,因爲系統缺少足夠的緩衝空間或隊列已滿。

的錯誤是在此聲明read += stream.Read(data, read, data.Length - read);

+0

您應該最後解決發送方關閉連接的情況,而接收方仍然期望獲得額外的數據(在這種情況下'stream.Read()'將返回'0')。 – 2012-07-31 13:19:21

回答

0

我會嘗試讓更小的數據塊。在你的代碼已經開始了與所有數據(2GB在失敗的情況下的時間跌落下來的東西更小 - 數據以塊發送反正例如:。

read += stream.Read(buffer, read, 20480); 

這將一次讀取大約2k,以便不大於緩衝區空間或對隊列太大

如果您已經分配了2GB大小的緩衝區,那麼您的應用程序可能只有很少的內存底層框架可能無法爲自己分配2GB數據(總共分配4GB)來傳輸數據。

+0

我知道,但爲什麼它收到2GB,它應該只接收5kb – 2012-07-31 14:07:47

+0

任何人都可以幫助我? – 2012-07-31 15:33:00

+0

你確定5k正在發送? 'numberofbytesArray'中的值是什麼?另外,在調用'ReceiveImage'之前,你確定沒有別的東西能從流中讀取任何東西嗎? 'BitConverter'的用戶是正確的,所以唯一的辦法就是無法獲得正確的值,如果'Image.Length'不是5K,或者已經讀取了全部或部分字節會破壞你閱讀lenght ... – 2012-07-31 15:42:44