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

时间:2018-02-03 19:39:00

标签: 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;
    }
}

2 个答案:

答案 0 :(得分:1)

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

您的方法包含四个昂贵的步骤:

  1. 截屏
  2. 调整屏幕大小
  3. 将屏幕截图压缩为PNG
  4. 通过网络传输屏幕
  5. 您是否已单独测量这些步骤?我的猜测是每一个都非常贵。

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

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

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

答案 1 :(得分:1)

  1. 不要继续创建新的连接。使用相同的。
  2. 摆脱ByteArrayOutputStream,这完全浪费时间和空间,以及ObjectOutputStream,并将图像直接写入套接字输出流。