【问题标题】:Networkstream not responding网络流没有响应
【发布时间】:2015-08-16 09:00:49
【问题描述】:

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

   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);刚刚在那里添加了一个断点,但它不起作用。 **只有当我关闭客户端程序并停止调试时,我才能在服务器端的图片框中看到图像。 为什么会这样?有什么想法吗?

【问题讨论】:

  • pictureBox1.Image = Image.FromStream(ns);只是在那里添加了一个断点,但它不起作用 - 这是否意味着它永远不会到达断点,或者没有过去了吗?
  • 它只是没有超过它。在它起作用之前。 @Amit
  • 您是否尝试将字节抓取到buff
  • @Amit ye​​p.still 没有运气
  • 因此,如果您在分配数组后立即尝试读取流 (ns) 的“计数”字节,那么在客户端关闭之前,对 ns.Read(buff, 0, count) 的调用不会返回?这很奇怪……

标签: c# networking stream


【解决方案1】:

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

ns.Read(temp, 0, 4);:这是一个错误,因为它假定读取将准确返回 4 个字节。情况可能并非如此。同样,使用 BinaryReader.ReadInt32 安全地读取 int。

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

【讨论】:

  • 以前从未使用过 http 或 wcp.. 所以我想这就是我要使用的 :) 我还有另一个非常相似且与此相关的问题。我应该打开一个新问题还是我可以只编辑上面的帖子,你可以帮助我吗?感谢一切! @usr
  • 您可以在 cmets 中提出您的相关问题。
  • 我实际上想发送有关图像的其他信息,例如应该绘制的位置。例如 (400,829)。两者都是 int。我是否必须编写每个 ns.write(//转换为字节的数字)并每次都使用网络,或者我可以将它写入常规的 memorystream,然后复制整个内容? @usr
  • 两者都可以。多亏了 Nagling,两者通常会导致发送相同的网络数据包。但也许你想禁用 Nagling。在这种情况下,最好进行一次大发送操作。您要发送的字段越多,protobuf 就越有吸引力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
相关资源
最近更新 更多