Hallo,
folgendes Problem:
Ich hab eine Linux-Kiste im Headless-Mode (kein Monitor, keine Maus und Tastatur). Darauf läuft in X11 eine Anwendung, welche ich gerne über’s Netzwerk benutzen möchte. Prinzipiell funktioniert das mit VNC prima.
Nur würde ich gerne die VNC Funktionalität erweitern, indem ich Drucker-Support etc. einbaue. D.h. ich drucke in der Anwendung auf der Linux-Kiste was aus (in eine File oder PDF), die eigene VNC artige Implementierung schnappt sich die File und schickt sie zum Client, der dann damit den lokalen Standarddrucker befüttert. File upload und download Features wären auch nicht schlecht. Das ganze lässt sich natürlich noch weiter spinnen …
Das ganze würde ich gerne, sowohl auf Client als auch auf Serverseite mit Java implementieren.
Nun hab ich ein bisschen mit AWT’s Robot Klasse rumgespielt. Den Screen capturen mit einer Auflösung von 1024x768 dauert hier im Schnitt 23Millisekunden. Das aktuelle Bild dann mit dem letzten vergleichen und die “dirty rectangles” zum Client übertragen, der sie dann bei sich im Client updatet. Maus und Tastatureingaben sollten ja mit dem Robot ebenfalls kein Problem sein.
Damit die CPU-Last nicht ins unermessliche steigt, müsste man die refresh-rate begrenzen. Hab dazu mal n kleines Testprogrämmchen gebastelt:
public class RobotTest {
public static void main(String[] args) throws AWTException, IOException, InterruptedException {
// determine current screen size
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screenSize = toolkit.getScreenSize();
Rectangle screenRect = new Rectangle(screenSize);
long fps = 15; // refresh rate set to 15fps
Robot r = new Robot();
BufferedImage screenScrape = null;
// measure scrape time
long start = System.currentTimeMillis();
for (int i=0;i<100;i++) {
screenScrape = r.createScreenCapture(new Rectangle(0,0,1024,768)); // hardcoded to 1024x768 only
}
long stop = System.currentTimeMillis();
// results
long timePerScrape = (stop-start)/100;
System.out.println("time per scrape="+timePerScrape);
// test cpu load
long fpsSleepTime = (1000 / fps)-timePerScrape;
System.out.println("fpsSleepTime="+fpsSleepTime);
for (int i=0;i<1000;i++) {
screenScrape = r.createScreenCapture(new Rectangle(0,0,1024,768));
Thread.sleep(fpsSleepTime);
}
// ImageIO.write(screenScrape, "png", new File("c:/screen.png"));
}
}```
Auf meiner Maschine (Dualcore, 2.13Ghz), krieg ich mit 15fps eine CPU-Last von ~9% bei 15fps (im "test cpu load block mal in den Taskmanager schauen). Weiß allerdings noch nicht wie rechenaufwendig das berechnen der dirty rectangles ist.
Soweit die Theorie. Sehr ihr da irgendwelche "Schwierigkeiten" oder Probleme die sich noch ergeben könnten? Was haltet ihr von der Idee? Bzgl. meinen gewünschten Features (vor allem die Sache mit dem drucken), hab ich bisher nur kommerzielle Software gefunden, die dann meist auch nicht für Linux geeignet war.
- Alex