我正在尝试制作远程桌面应用程序。但数据传输速度很慢任何人都知道如何加快我在 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;
}
}
最佳答案
创建远程桌面应用程序是一项艰巨的任务,因为涉及的数据量巨大,并且只能通过复杂的方法近乎实时地处理。
您的方法由四个昂贵的步骤组成:
- 截屏
- 调整屏幕截图大小
- 将屏幕截图压缩为 PNG
- 通过网络传输屏幕
您是否分别测量了这些步骤?我的猜测是,每一件都贵得令人望而却步。
Android 应用程序可能无法达到足够的速度。许多远程桌面应用程序本身并不传输屏幕内容。相反,捕获图形子系统调用(例如绘图命令)并传输它们。如果他们确实传输屏幕内容,则只会传输已更改的内容。
此外,您还需要对网络传输进行一些流量控制,即您需要能够适应网络状况,并在网络速度较慢时减少传输的数据量。
只有充分利用硬件优化的 Android API,您才有机会使用远程桌面应用程序。首先想到的是创建和传输视频流。这减少了要传输的数据量并充分利用了硬件。
关于java 如何使用socket获得更快的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48601257/