C# 网络流没有响应

C# 网络流没有响应,c#,networking,stream,C#,Networking,Stream,我正在尝试通过网络流发送图像这是我的客户端代码: 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 = GetDeskto

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

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

    }
我没有在picturebox上看到任何东西,我猜程序挂在这里-
pictureBox1.Image=Image.FromStream(ns)刚刚在那里添加了一个断点,但它不起作用。
**只有当我关闭客户端程序并停止调试时,我才能在服务器端的picturebox上看到一个图像。

为什么?有什么想法吗?

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

ns.读取(温度0,4):这是一个错误,因为它假定读取将返回正好4个字节。情况可能并非如此。再次使用
BinaryReader.ReadInt32
安全地读取int


更好的是,放弃自定义序列化格式,使用protobuf长度前缀之类的东西。或者,HTTP或WCF。

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

ns.读取(温度0,4):这是一个错误,因为它假定读取将返回正好4个字节。情况可能并非如此。再次使用
BinaryReader.ReadInt32
安全地读取int


更好的是,放弃自定义序列化格式,使用protobuf长度前缀之类的东西。或者,HTTP或WCF.

pictureBox1.Image=Image.FromStream(ns);只是在那里添加了一个断点,但它不起作用-这是否意味着它永远无法到达断点,或者无法通过断点?它只是无法通过断点。在它起作用之前@AmitDId您是否尝试将字节抓取到
buff
中?@Amit是的。仍然没有luckSo如果您在分配数组后立即尝试读取流的“count”字节(
ns
),则对
ns.read(buff,0,count)
的调用将在客户端关闭之前不会返回?这很奇怪…pictureBox1.Image=Image.FromStream(ns);只是在那里添加了一个断点,但它不起作用-这是否意味着它永远无法到达断点,或者无法通过断点?它只是无法通过断点。在它起作用之前@AmitDId您是否尝试将字节抓取到
buff
中?@Amit是的。仍然没有luckSo如果您在分配数组后立即尝试读取流的“count”字节(
ns
),则对
ns.read(buff,0,count)
的调用将在客户端关闭之前不会返回?这很奇怪…以前从未使用过http或wcp。。所以我想这就是我要用的:)我还有一个非常类似的问题,与此相关。我应该打开一个新的问题,还是我可以只编辑上面的文章,你可以帮助我?谢谢你所做的一切@usrYou可以在评论中提出相关问题。实际上,我想发送有关该图像的其他信息,例如该图像应绘制的位置。例如(400829)。两者都是int。我是否必须每次写入ns.write(//转换为字节的数字)并使用网络,或者我是否可以将其写入常规的
内存流
,然后复制整个内容@我们两个都可以。多亏了唠叨,这两者通常都会导致发送相同的网络数据包。但也许你想禁用唠叨。在这种情况下,最好执行一次大型发送操作。您想要发送的字段越多,protobuf就越吸引人。以前从未使用http或wcp。。所以我想这就是我要用的:)我还有一个非常类似的问题,与此相关。我应该打开一个新的问题,还是我可以只编辑上面的文章,你可以帮助我?谢谢你所做的一切@usrYou可以在评论中提出相关问题。实际上,我想发送有关该图像的其他信息,例如该图像应绘制的位置。例如(400829)。两者都是int。我是否必须每次写入ns.write(//转换为字节的数字)并使用网络,或者我是否可以将其写入常规的
内存流
,然后复制整个内容@我们两个都可以。多亏了唠叨,这两者通常都会导致发送相同的网络数据包。但也许你想禁用唠叨。在这种情况下,最好执行一次大型发送操作。你想发送的字段越多,protobuf就越有吸引力。