c# Send/Recieve 来自流的图像

c# Send/Recieve Image from Stream

我目前写了以下代码。 客户端服务器端。 我想按需从服务器向客户端发送图像。图片将是服务器的截图,所以我的尺寸总是不同的。

发送第一张图片是一个很好的任务。但是当我发送下一个时,图片框没有刷新。 通过调试我可以看到从服务器到客户端的字节成功通过。但是代码似乎只是接收字节而不是继续代码的其余部分

“while”循环(客户端) 的“注释”行似乎在调试中有效,但我看不到结果,因为 程序卡在 while 循环 中,我无法在前台获得应用程序的 window

我目前正在 windows 进行测试,但客户端将进行调整以在 android

上工作

服务器图片 客户图片

服务器

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    Socket client;
    private void button2_Click(object sender, EventArgs e)
    {
        Bitmap bmp = TakingScreenshotEx1();
        bmp.Save("1.jpeg", ImageFormat.Jpeg);

        byte[] buffer = ReadImageFile("1.jpeg");
        int v = client.Send(buffer, buffer.Length, SocketFlags.None);
        Console.WriteLine("Image SENT!");
    }

    private Bitmap TakingScreenshotEx1()
    {
        //Create a new bitmap.
        var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                       Screen.PrimaryScreen.Bounds.Height,
                                       PixelFormat.Format32bppArgb);

        // Create a graphics object from the bitmap.
        var g = Graphics.FromImage(bmpScreenshot);

        // Take the screenshot from the upper left corner to the right bottom corner.
        g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                         Screen.PrimaryScreen.Bounds.Y,
                         0,
                         0,
                         Screen.PrimaryScreen.Bounds.Size,
                         CopyPixelOperation.SourceCopy);

        return bmpScreenshot;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.Bind(iep);
        server.Listen(100);
        Console.WriteLine("Waiting for client....");
        client = server.Accept();
    }
    private static byte[] ReadImageFile(String img)
    {
        FileInfo fileinfo = new FileInfo(img);
        byte[] buf = new byte[fileinfo.Length];
        FileStream fs = new FileStream(img, FileMode.Open, FileAccess.Read);
        fs.Read(buf, 0, buf.Length);
        fs.Close();

        GC.ReRegisterForFinalize(fileinfo);
        GC.ReRegisterForFinalize(fs);
        return buf;
    }
}

客户

public Form1()
{
    InitializeComponent();
    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] buffer = new byte[1000000];
private void button1_Click(object sender, EventArgs e)
{  

   if(client.Connected != true)
    client.Connect(iep);


 //   while (true)
 //   {
        int v = client.Receive(buffer, buffer.Length, SocketFlags.None);

        Console.WriteLine("Data Received!");

        Stream stream = new MemoryStream(buffer);
        var img = Bitmap.FromStream(stream);
        pictureBox1.Image = img;

 //   }

}

正如 Peter Duniho 指出的那样 while loop 阻塞了 UI 线程

我在这里找到了合适的解决方案

您还可以查看在定时器方法中调用主线程