我对像Anydesk这样的远程桌面应用程序进行了编码,但问题是发送了前1-2个帧,然后什么也没有发生。我已经了解了所有内容,并且发现服务器的输入流可能无法正常工作,因为发送的数据包无法发送。 而且我已经调试了数据包ID,并且看到如果桌面流在其中运行了错误的数据包ID,例如'-234343'。
我已经测试了如何发送和接收图像数据的许多可能性,但是它并没有失败,因为如果我要发送完全相同的文件,那么它会以某种方式出现,因为我一次发送了很多数据。
公共类ScreenManager {
public static final ArrayList<UUID> clients = new ArrayList<UUID>();
public static final HashMap<UUID, Integer> monitors = new HashMap<UUID, Integer>();
public static GraphicsDevice[] devices;
private static boolean running = false;
private static final HashMap<Integer, Robot> robots = new HashMap<Integer, Robot>();
public static void start() {
if(running)
return;
running = true;
devices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
for(int i = 0; i < devices.length; i++) {
try {
robots.put(i, new Robot(devices[i]));
} catch (AWTException e) {}
}
for(int i = 0; i < devices.length; i++) {
final int monitor = i;
new Thread() {
public void run() {
while(running) {
try {
BufferedImage frame = robots.get(monitor).createScreenCapture(new Rectangle(devices[monitor].getDisplayMode().getWidth(), devices[monitor].getDisplayMode().getHeight()));
ArrayList<UUID> clientlist = new ArrayList<UUID>();
for(int i = 0; i < clients.size(); i++) {
if(monitors.get(clients.get(i)) == monitor) {
clientlist.add(clients.get(i));
}
}
if(clientlist.size() > 0)
Client.instance.sendPacket(new DesktopDataPacket(clientlist, DesktopDataType.DATA, devices.length, frame));
}catch(Throwable t) {}
}
}
}.start();
}
}
public static void stop() {
if(!running)
return;
running = false;
robots.clear();
monitors.clear();
clients.clear();
devices = null;
}
}