java 如何使用socket获得更快的速度

标签 java android sockets

我正在尝试制作远程桌面应用程序。但数据传输速度很慢任何人都知道如何加快我在 Android 上运行的客户端应用程序的传输速度

public class SendLiveScreenThread extends Thread {

    public void run() {
        try {
            while (true) {
                Socket socket = new Socket(connect.ConnectionDetails.clientip, connect.ConnectionDetails.RemoteDesktopFeedSendPort);
                BufferedImage screenshot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

                ByteArrayOutputStream os = new ByteArrayOutputStream();
                ImageIO.write(resize(screenshot, 400, 200), "png", os);
                InputStream fis = new ByteArrayInputStream(os.toByteArray());
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject(buffer);
                socket.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
            run();

        }
    }

    public BufferedImage resize(BufferedImage img, int newW, int newH) {
        Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
        BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

        Graphics2D g2d = dimg.createGraphics();
        g2d.drawImage(tmp, 0, 0, null);
        g2d.dispose();

        return dimg;
    }
}

最佳答案

创建远程桌面应用程序是一项艰巨的任务,因为涉及的数据量巨大,并且只能通过复杂的方法近乎实时地处理。

您的方法由四个昂贵的步骤组成:

  1. 截屏
  2. 调整屏幕截图大小
  3. 将屏幕截图压缩为 PNG
  4. 通过网络传输屏幕

您是否分别测量了这些步骤?我的猜测是,每一件都贵得令人望而却步。

Android 应用程序可能无法达到足够的速度。许多远程桌面应用程序本身并不传输屏幕内容。相反,捕获图形子系统调用(例如绘图命令)并传输它们。如果他们确实传输屏幕内容,则只会传输已更改的内容。

此外,您还需要对网络传输进行一些流量控制,即您需要能够适应网络状况,并在网络速度较慢时减少传输的数据量。

只有充分利用硬件优化的 Android API,您才有机会使用远程桌面应用程序。首先想到的是创建和传输视频流。这减少了要传输的数据量并充分利用了硬件。

关于java 如何使用socket获得更快的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48601257/

相关文章:

php - 尝试以symfony中其访问权限禁止的方式访问套接字

c# - 异步服务器套接字多个客户端

java - 通过字节码将私有(private)类从 Kotlin 转换为 Java

java - 在 `@ConfigurationProperties` 方法上使用 `@Bean` 注释

java - java中的类型转换

java - 如何在 onCreate/主线程中获取房间列表的大小?

java - JASPIC Wildfly 9 validateRequest with session

android - Android中的进程间通信

android - 如何像 kitkat/lollipop 系统键盘一样更改 android 软键盘的外观

perl - 驼鹿对象中Socket属性的奇怪行为