0

对此,我一直在使用序列化来不断发送图像数据。这意味着我将图像保存在内存流中,并通过序列化发送。

但我不明白我是否应该使用序列化或网络流。我唯一要做的就是循环发送图像。

我一直在尝试让 Ne​​tworkstream 工作,但它并没有按照我的方式进行,所以这是我的代码。出于某种原因,它只感知 1 张图像,当我使用序列化时,它会不断进行。

    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(process, tcp.GetStream()); 做的很简单,截取一个窗口(进程=进程的名称),然后将其保存在哪里(tcp.GetStream()),使其发送和流式传输(至少我认为是这样)。

它确实有点工作,如果我断开连接并连接等,它会发送图像,但我认为它非常随机,不知道为什么我必须这样做,我希望它继续发送只要循环处于活动状态.

(这与序列化和 MemoryStream 完美配合(将位图保存在内存流中并在序列化中使用))。

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

对于我的目的,(发送图像)、序列化或 NetworkStream 哪个更快?如果 NetworkStream 更快,我怎样才能让它工作,我上面的代码有什么问题。

谢谢

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

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

                }

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

4

2 回答 2

3

你说当你断开连接时你会得到一个图像。这是有道理的,因为您是直接从流中读取图像。由于流是 a NetworkStream,它不知道何时必须结束。

我的建议是在使用 a 接收/发送实际图像缓冲区之前添加图像缓冲区的大小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);
}
于 2013-08-05T12:54:56.587 回答
0

我稍微调整了代码,所以只是在这里为其他人写。现在确定它是更好还是更糟。这是发送部分,我跳过转换为 byte[] 并使用 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:

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

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

认为是这样的。

于 2013-08-06T03:38:28.317 回答