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

标签 c# sockets tcpclient tcplistener

我正在使用 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/

相关文章:

javascript - 在 mvc razor 中用 javascript 编写 @

c# - 通过 wcf 序列化谓词

c++ - Winsock 代码在 freeaddrinfo 中崩溃

c - 在服务器连接中排队接收

C# 从 TcpClient 读取流

C# 引用计数

c# - JQuery 模态对话框使用追加显示在叠加层后面

ruby-on-rails - Ruby Rails - Cloud9 - (SocketError)

c# - TCPClient收不到数据

JAVA服务器和.Net客户端编程