0

TCP ソケットを使用してイメージを送受信するためにこれらのコードを作成しましたが、受信コードは機能しませんでした。

これは送信コードです:

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);

4

1 に答える 1

0

データの小さなチャンクを取得してみます。コードでは、すべてのデータから始めています(失敗した場合は、一度に2GB。それをもっと小さいものにドロップします。データはとにかくチャンクで送信されます。例:

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

これは、バッファスペースより大きくならないように、またはキューに対して大きすぎないように、一度に約2kを読み取ります。

サイズが2GBのバッファを割り当てた場合、アプリケーションに残っているメモリはほとんどない可能性があります。基盤となるフレームワークは、データを転送するために2GBのデータを自分自身に割り当てることができない可能性があります(合計4GBが割り当てられています)。

于 2012-07-31T13:32:51.903 に答える