我正在尝试制作远程桌面应用程序。但是数据传输速度很慢,任何人都知道如何加快我在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;
}
}
答案 0 :(得分:1)
创建远程桌面应用程序是一项非常重要的任务,因为涉及的数据量巨大,只能通过复杂的方法近乎实时地处理。
您的方法包含四个昂贵的步骤:
您是否已单独测量这些步骤?我的猜测是每一个都非常贵。
可能是因为使用Android应用程序无法达到足够的速度。许多远程桌面应用程序本身不传输屏幕内容。而是捕获图形子系统调用(例如绘图命令)并传输它们。如果他们确实传输了屏幕内容,他们只传输已经改变的内容。
此外,您需要对网络传输进行一些流量控制,即如果网络速度慢,您需要能够适应网络状况并减少要传输的数据量。
如果您充分利用硬件优化的Android API,您只有机会使用远程桌面应用程序。首先想到的是创建和传输视频流。这减少了要传输的数据量并充分利用了硬件。
答案 1 :(得分:1)
ByteArrayOutputStream
,这完全浪费时间和空间,以及ObjectOutputStream
,并将图像直接写入套接字输出流。