网络流没有响应

本文关键字:响应 网络 | 更新日期: 2023-09-27 18:08:12

我正在尝试通过网络流发送图像,这是我的客户端代码:

   private void Form1_Load(object sender, EventArgs e)
    {
        TcpClient client=new TcpClient();
        client.Connect("127.0.0.1", 10);
       NetworkStream  ns = client.GetStream();
        Bitmap screen = GetDesktopImage();//generate a screenshot.
        MemoryStream ms = new MemoryStream();
        screen.Save(ms, ImageFormat.Png);
        byte[] byteCount = BitConverter.GetBytes((int)ms.Length);
        ms.Position = 0;
       ns.Write(byteCount, 0, byteCount.Length);
        ms.CopyTo(ns);
        ms.SetLength(0);

    }

这是服务器:

    private void Start()
    {
        TcpListener listen = new TcpListener(IPAddress.Any, 10);
        listen.Start();
        NetworkStream ns = new NetworkStream(listen.AcceptTcpClient().Client);
        byte[] temp = new byte[4];
        ns.Read(temp, 0, 4);
        int count = BitConverter.ToInt32(temp, 0);   
        byte[] buff = new byte[count];
        pictureBox1.Image = Image.FromStream(ns);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Thread th = new Thread(Start);
        th.Start();
    }

我没有在图片框上看到任何东西,我猜程序挂在这里- pictureBox1.Image = Image.FromStream(ns);只是在那里添加了一个断点,它不工作。**只有当我关闭客户端程序并停止调试时,我才能在服务器端的图片框上看到图像。为什么呢?什么好主意吗?

网络流没有响应

我的猜测是Image.FromStream不知道停止阅读时,它已经绘制了完整的图像。也许PNG格式甚至不允许这样做。你需要给Image.FromStream一个有限制大小的流。最简单的方法是使用BinaryReader.ReadBytes(count)来读取所需的确切字节数。

ns.Read(temp, 0, 4);:这是一个错误,因为它假设读取将返回恰好4字节。但事实可能并非如此。同样,使用BinaryReader.ReadInt32安全地读取int类型

更好的做法是,放弃自定义序列化格式,使用类似protobuf长度前缀的格式。