繁体   English   中英

使用TCP套接字发送和接收图像

[英]Send and receive an image with a tcp socket

我已经编写了这些代码来使用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 = IPAdress.HostToNetworkOrder(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;                    
    }
}

将IPAdress.HostToNetworkOrder删除为以下内容后进行编辑

int size = BitConverter.ToInt32(data,0);

仍然有问题。 问题是当我发送大小时,它以5kb的大小发送,但是当我收到它时,我发现它接近2GB。

更进一步,我在这一行得到一个错误

read += stream.Read(data, read, data.Length - read);

随着以下消息

无法从传输连接读取数据。 由于系统缺少足够的缓冲区空间或队列已满,因此可以对套接字执行操作。

除非要创建与Java服务器/客户端兼容的服务器,否则不要使用HostToNetwork命令。 如果这样做,还需要更改要发送的int数据缓冲区的顺序。

您可能还受益于将客户端上收到的字节直接写到内存流中,而不是分配数据并向其中写入字节。 还有一个重要的注意事项,在将其交给位图构造函数之前,请不要忘记设置imagestream.Position = 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM