gpt4 book ai didi

c# - 如何使用 TCP 提高发送/接收速度? C#

转载 作者:行者123 更新时间:2023-12-05 04:26:02 25 4
gpt4 key购买 nike

我正在使用 TCP 制作一个远程桌面应用程序,我已经尝试/搜索了许多方法来捕获屏幕并发送它,但它们都做同样的事情。

发送:

  1. 使用 Bitmap 和 copyfrom 方法捕获屏幕
  2. 使用内存流保存位图
  3. 使用TCP套接字发送序列化的位图

接收:

  1. 使用readbytes方法接收消息
  2. 使用memorystream存储字节数组
  3. 使用Image.FromStream(memorystream)创建图像

它在 LAN 连接上运行良好,但是当我使用 VPN 连接到远程服务器时,图像需要 0.5 到 5 秒才能到达

这是我的代码:

桌面类:

internal static class Desktop
{
public static Image TakeScreenShoot()
{
Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
try
{
using (Graphics Graphics = Graphics.FromImage(bitmap))
{
Graphics.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
}
}
catch
{
bitmap = null;
}
return bitmap;
}

public static void SerializeScreen(Stream stream, Image Image)
{
MemoryStream memory = new MemoryStream();
Image.Save(memory, System.Drawing.Imaging.ImageFormat.Jpeg);
int numBytes = (int)memory.Length;
BinaryWriter binaryWriter = new BinaryWriter(stream);
binaryWriter.Write(numBytes);
binaryWriter.Write(memory.GetBuffer(), 0, numBytes);
stream.Flush()
}

public static Image DeserializeScreen(Stream stream)
{
BinaryReader binaryReader = new BinaryReader(stream);
int numBytes = binaryReader.ReadInt32();
byte[] buffer = binaryReader.ReadBytes(numBytes);
MemoryStream memory = new MemoryStream(buffer);
return Image.FromStream(memory);
}
}

宿主类

private void SendImage()
{
while (Status == ServerStatus.Connected)
{
try
{
Image bitmap = Desktop.TakeScreenShoot();
Desktop.SerializeScreen(_NetStream,bitmap);
}
catch
{

}
}
}

客户端类

protected void ReciveMessage()
{
while(Status == ServerStatus.Connected)
{
try
{
ImageRecibed?.Invoke(Desktop.DeserializeScreen(_NetStream));
}
catch
{

}
}
}

如何改进我的代码以提高运行速度?

这里是Video应用速度

PD。我对此很陌生

最佳答案

我认为这是一个很好的问题。我的套接字编程经验非常有限。但是我可以想到一个简单的方法。如果在发送前通过压缩字节数组来减小字节数组的大小,性能可能会略有提高。

这是一个很好的例子=> How to compress a Byte array without stream or system io

数据包离开 LAN 后,许多外部因素开始发挥作用。例如,您使用的 VPN 服务器是否付费,或者此 VPN 服务器的位置在哪里,都会有很大的不同?它离你近吗?,或者你使用的VPN服务器的硬件功率是多少?有很多可能性。

此外,使用 Udp 而不是 Tcp 也会导致性能略有提高,因为 Udp 的数据包较小且没有确认。所以如果你使用 Udp 并在发送前压缩它,也许你可以得到一个合适的结果,但这里的问题是可靠性。此外,即使您使用 Udp 和压缩,我也不确定性能是否会提高到您的目标水平。

因此,我希望这方面的专家能够提供详细信息,因为我对此非常好奇。

关于c# - 如何使用 TCP 提高发送/接收速度? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73114026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com