C# 网络流还是序列化发送图像?

C# 网络流还是序列化发送图像?,c#,image,performance,stream,C#,Image,Performance,Stream,对于这一点,我一直在使用序列化不断地发送图像数据。 这意味着我将一个图像保存在memorystream中,并通过序列化发送它 但我不明白我应该使用序列化还是网络流。 我正在做的唯一一件事就是在循环中发送图像 我一直在尝试让Networkstream工作,但它不符合我的要求,所以这里是我的代码。出于某种原因,它只感知一个图像,当我使用序列化时,它会不断地变化 private void Initialize() { NetSerializer.Serializer.I

对于这一点,我一直在使用序列化不断地发送图像数据。 这意味着我将一个图像保存在memorystream中,并通过序列化发送它

但我不明白我应该使用序列化还是网络流。 我正在做的唯一一件事就是在循环中发送图像

我一直在尝试让Networkstream工作,但它不符合我的要求,所以这里是我的代码。出于某种原因,它只感知一个图像,当我使用序列化时,它会不断地变化

    private void Initialize()
    {
        NetSerializer.Serializer.Initialize(new Type[] { typeof(MemoryStream) });
        tcplisten = new System.Net.Sockets.TcpListener(IPAddress.Any, 1700);
        tcplisten.Start();

    }
    private void Listen()
    {
        try
        {
            using (TcpClient tt1 = tcplisten.AcceptTcpClient())
            {
                tt1.NoDelay = true;
                while (checkBox1.Checked)
                {
                    panel1.BackgroundImage = Image.FromStream(tt1.GetStream());
                }
            }
        }
        catch
        {
        }

    }
以下是发送:

    private void Send()
    {
        try
        {                
            string process = Proccessname.Text;               
            using (TcpClient tcp = new TcpClient())
            {

                tcp.NoDelay = true;
                while (capcon == true)
                {

                    if (tcp.Connected)
                    {
                        PrintWindow(process, tcp.GetStream());

                    }
                    else
                    {
                        tcp.Connect(adress);
                    }
                }
            }
        }
        catch
        {
        }  
    }
什么是PrintWindow(进程,tcp.GetStream());只需截图一个窗口(进程=进程的名称),然后保存到哪里(tcp.GetStream()),这样它就可以发送并流式传输(至少我认为是这样)

如果我断开连接等,它会发送一个图像,但我认为这是非常随机的,不知道为什么我必须这样做,我希望它一直发送,只要循环是活跃的

(这与序列化和MemoryStream(将位图保存在MemoryStream中,并在序列化中使用它)完美结合)

这就像是两个问题,取决于第一个问题的答案

对于我的目的(发送图像)、序列化或网络流,什么更快? 如果NetworkStream更快,我如何让它工作,上面的代码有什么问题

谢谢

          if (tcp.Connected)
                {
                    MemoryStream ms = new MemoryStream();

                    PrintWindow(process, ms);
                    panel1.BackgroundImage = Image.FromStream(ms);

                }

这是可行的,因此它正在连接,并且数据正在保存(为此更改为MemoryStream而不是NetworkStream)。

您说断开连接时会得到一个图像。这是有意义的,因为您直接从流中读取图像。由于流是
网络流
,它不知道何时结束

我的建议是在使用
BinaryReader
接收/发送实际图像缓冲区之前,添加图像缓冲区的大小,如下所示:

BinaryReader reader = new BinaryReader(netStream);
while (true) {
  // read how big the image buffer is
  int ctBytes = reader.ReadInt32();

  // read the image buffer into a MemoryStream
  MemoryStream ms = new MemoryStream(reader.ReadBytes(ctBytes));

  // get the image from the MemoryStream
  Image img = Image.FromStream(ms);

  // ...do something with img
}
发送时:

BinaryWriter writer = new BinaryWriter(netStream);
while (someCondition) {
  // get the image
  Image img = SomeImage();

  // save the image to a MemoryStream
  MemoryStream ms = new MemoryStream();
  img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

  // get the image buffer
  byte[] buffer = new byte[ms.Length];
  ms.Seek(0, SeekOrigin.Begin);
  ms.Read(buffer, 0, buffer.Length);

  // write the size of the image buffer
  writer.Write(buffer.Length);

  // write the actual buffer
  writer.Write(buffer);
}

你说当你断开连接时,你得到了一个图像。这是有意义的,因为您直接从流中读取图像。由于流是
网络流
,它不知道何时结束

我的建议是在使用
BinaryReader
接收/发送实际图像缓冲区之前,添加图像缓冲区的大小,如下所示:

BinaryReader reader = new BinaryReader(netStream);
while (true) {
  // read how big the image buffer is
  int ctBytes = reader.ReadInt32();

  // read the image buffer into a MemoryStream
  MemoryStream ms = new MemoryStream(reader.ReadBytes(ctBytes));

  // get the image from the MemoryStream
  Image img = Image.FromStream(ms);

  // ...do something with img
}
发送时:

BinaryWriter writer = new BinaryWriter(netStream);
while (someCondition) {
  // get the image
  Image img = SomeImage();

  // save the image to a MemoryStream
  MemoryStream ms = new MemoryStream();
  img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

  // get the image buffer
  byte[] buffer = new byte[ms.Length];
  ms.Seek(0, SeekOrigin.Begin);
  ms.Read(buffer, 0, buffer.Length);

  // write the size of the image buffer
  writer.Write(buffer.Length);

  // write the actual buffer
  writer.Write(buffer);
}

我对代码做了一些调整,所以我要在这里为其他人写。 现在确定是好是坏。 这是发送部分,我跳过转换成字节[],只使用MemoryStream

                            using (MemoryStream ms = PrintWindow(process))
                        {
                            writer.Write(ms.Length);
                            writer.Write(ms.GetBuffer());
                        }
以下是接收部分:

panel1.BackgroundImage = Image.FromStream(new MemoryStream(reader.ReadBytes((Int32)reader.ReadInt64())));
把一切都放在一个命令里

当然BinaryWriter/Reader在那里,但是我没有把它们放在这里,因为我只是展示我是如何更改代码的

我使用了上面的Angelo Geels代码*

编辑:出于某种原因,它似乎只在.bmp中工作,不知道为什么,对我来说没有意义

编辑2:

这可以通过以下方法解决:

Write.Write(ms.GetBuffer(),0,(int)ms.Length)


我想是这样的。

我对代码做了一些调整,所以我只想在这里为其他人编写它。 现在确定是好是坏。 这是发送部分,我跳过转换成字节[],只使用MemoryStream

                            using (MemoryStream ms = PrintWindow(process))
                        {
                            writer.Write(ms.Length);
                            writer.Write(ms.GetBuffer());
                        }
以下是接收部分:

panel1.BackgroundImage = Image.FromStream(new MemoryStream(reader.ReadBytes((Int32)reader.ReadInt64())));
把一切都放在一个命令里

当然BinaryWriter/Reader在那里,但是我没有把它们放在这里,因为我只是展示我是如何更改代码的

我使用了上面的Angelo Geels代码*

编辑:出于某种原因,它似乎只在.bmp中工作,不知道为什么,对我来说没有意义

编辑2:

这可以通过以下方法解决:

Write.Write(ms.GetBuffer(),0,(int)ms.Length)



想想看,就是这样。

您的第二段代码实际上没有显示通过NetworkStream发送的MemoryStream,是吗?噢,看到了,ms=tcp.GetStream(),将解决这个问题。示例代码的第二个片段仍然没有意义,因为您正在创建一个新的TcpClient并直接从中获取流,甚至没有连接到任何东西。将给出整个代码,因为我认为它没有任何意义。您确定这就是您的全部代码吗?对我来说仍然没有多大意义。您的第二段代码实际上没有显示通过NetworkStream发送的MemoryStream,是吗?哦,看到了,ms=tcp.GetStream(),将解决这个问题。示例代码的第二个片段仍然没有意义,因为您正在创建一个新的TcpClient并直接从中获取流,甚至没有连接到任何东西。将给出整个代码,因为我认为它没有任何意义。您确定这就是您的全部代码吗?对我来说仍然没有多大意义。我不想使用MemoryStream,只想直接将它保存到NetworkStream,它应该会更快。我正试图加快序列化的速度。我必须使用字节数组的MemoryStream。正如我的回答所说,你不能这样做,因为那样图像阅读器就无法知道流何时结束。嗯,奇怪。或者不奇怪,这是有道理的。但问题是我得到了一个建议,在网络流中写作。但是这与序列化有什么区别呢?不确定这里的序列化是什么意思,但这基本上是你自己的二进制序列化(我猜),发送缓冲区大小,然后是图像缓冲区本身。我正在寻找发送图像的最快方式,我的知识不足导致了许多问题,这就是为什么我想给NetworkStream一个外观,而不是序列化。但遗憾的是,你的代码对我不起作用,我不知道为什么。我不想使用MemoryStream,只想将它直接保存到NetworkStream,这样应该会更快。我正试图加快序列化的速度。我必须使用字节数组的MemoryStream。正如我的回答所说,你不能这样做,因为那样图像阅读器就无法知道流何时结束。嗯,奇怪。或者不奇怪,这是有道理的。但问题是我有一个建议