C# 网络流还是序列化发送图像?
对于这一点,我一直在使用序列化不断地发送图像数据。 这意味着我将一个图像保存在memorystream中,并通过序列化发送它 但我不明白我应该使用序列化还是网络流。 我正在做的唯一一件事就是在循环中发送图像 我一直在尝试让Networkstream工作,但它不符合我的要求,所以这里是我的代码。出于某种原因,它只感知一个图像,当我使用序列化时,它会不断地变化C# 网络流还是序列化发送图像?,c#,image,performance,stream,C#,Image,Performance,Stream,对于这一点,我一直在使用序列化不断地发送图像数据。 这意味着我将一个图像保存在memorystream中,并通过序列化发送它 但我不明白我应该使用序列化还是网络流。 我正在做的唯一一件事就是在循环中发送图像 我一直在尝试让Networkstream工作,但它不符合我的要求,所以这里是我的代码。出于某种原因,它只感知一个图像,当我使用序列化时,它会不断地变化 private void Initialize() { NetSerializer.Serializer.I
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。正如我的回答所说,你不能这样做,因为那样图像阅读器就无法知道流何时结束。嗯,奇怪。或者不奇怪,这是有道理的。但问题是我有一个建议