2012-07-31 4 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;      
     } 
    } 
} 

난 크기의 5킬로바이트하지만 때와 같이 전송을 보낼 때 문제가 2GB를 찾으면이 오류가 나타납니다.

전송 연결에서 데이터를 읽을 수 없습니다. 시스템에 충분한 버퍼 공간이 없거나 큐가 가득 차서 소켓에 대한 조작을 수행 할 수 있습니다.

오류는이 문장 read += stream.Read(data, read, data.Length - read);

+0

수신자가 여전히 추가 데이터를 기대하는 동안 (송신자가 연결을 닫는 상황을 정교하게 다룬다.'stream.Read()'는이 경우'0'을 리턴 할 것이다). –

답변

0

나는 데이터의 작은 덩어리를 점점 시도 것이다. 코드에서는 실패 할 경우 한 번에 모든 데이터 (2GB를 시작하고 작은 일에 그 드롭 다운 - 데이터가 어쨌든 청크로 전송됩니다 예를 들면 다음과 같습니다..

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

버퍼 공간보다 크지 않거나 대기열에 비해 너무 크지 않도록 한 번에 약 2k를 읽습니다.

크기가 2GB 인 버퍼를 할당 한 경우 응용 프로그램에 메모리가 거의 없을 것입니다 기본 프레임 워크는 아마도 데이터를 전송하기 위해 2GB의 데이터 (할당 된 총 4GB)를 할당 할 수 없습니다.

+0

나는 그것을 안다. 그러나 그것이 2GB를받는 이유는 단지 5kb를 받는다. –

+0

아무도 나를 도울 수 있냐?? –

+0

5k를 보내고 있습니까? 'numberofbytesArray'의 값은 무엇입니까? 또한,'ReceiveImage'를 호출하기 전에 스트림에서 아무 것도 읽지 못하셨습니까? 'BitConverter'의 사용자가 맞습니다. 올바른 값을 얻지 못하게하는 유일한 방법은'Image.Length'가 5K가 아니거나, 이미 읽은 것 또는 그 바이트의 일부를 읽는 방법을 망치는 것입니다. lenght ... –