# VNC server libs (VNCj oder ähnliche)



## evgeni (10. Aug 2010)

Liebe Forenmitglieder,

Ich habe vor kurzem die Aufgabe bekommen einen eingebauten VNC-Server für dioscuri zu schreiben (sieh Dioscuri - the modular emulator for digital preservation). Die Idee ist den JScrollPane, in dem die Emulation läuft, über einen eingebauten VNC-Server zu schicken.

Auf der Suche in Google habe ich VNCj ( LGPL VNCj | Download LGPL VNCj software for free at SourceForge.net ) entdeckt, kompiliert und teilweise damit gespielt. Sie entspricht im Großen, das was ich brauche. Das Problem damit ist "nur", dass VNCj zum letzten Mal in 2003 erneuert wurde und daher unter Java 1.5 oder 1.6 nicht läuft. Die implementierten Interfaces haben sich mit der Zeit ein wenig verändert... 

Meine Frage ist, ob jemand die Bibliothek schon versucht zu erneuern hat. 

Zweite Frage wäre, was man noch an Möglichkeiten hätte, wenn man auf VNCj verzichtet. Ich habe schon in google recherchiert, der Erfolg war leider nicht sehr "glänzend". Bis auf einige Projekte, die sich in der Phase "was wir uns vorstellen" befinden, ist wenig über das Thema zu finden.

Auf Beiträge und Fragen zu dem Thema werde ich mich freuen!

Grüße
Evgeni


----------



## Gast2 (10. Aug 2010)

Schomal bei RealVNC reingesehn? Ich glaub da gibt es auch ein Java VNC client. Vielleicht kann man den einbinden oder sich zumindest Anregungen holen.


----------



## tuxedo (11. Aug 2010)

Prinzipiell ist es möglich mit Java-Only mitteln einen VNC Server zu schreiben.

Man muss den Bildschirm scrapen (über den Robot nen Screenshot machen), dann ein "dirty rectangle detection" implementieren und das VNC-Protokoll mit den Infos/Daten füttern.

Das Problem dabei ist: Der Robot ist etwas ungeschickt implementiert und vergeudet jede Menge Performance wenn es darum geht schnell viele Screenshots zu machen. Eine wirklich brauchbare FPS Rate wird man damit nicht hinbekommen.

Ergo: Selbst via JNI/JNA den Screenshot machen und hier auf Performance achten. 

"Dirty Rectangle Detection", also das herausfinden "wo hat sich wieviel auf dem Bild geändert" ist mit Java möglich. Hier muss man halt nen guten Algo haben. 

Andere VNC Server haben "System Hooks" die dann Callback-Artig mitbekommen wo und was sich ändert. Das bringt nochmal nen Performance-Schub. Aber mit Java-Only mitteln ist man hier wieder sehr eingeschränkt.

TightVNC geht nochmal nen anderen Weg: Die bieten nicht nur Hook-Möglichkeiten, sondern setzen auch auf einen Mirror-Grafiktreiber. Dieser sitzt dann irgendwo im System VOR dem eigentlichen Grafiktreiber und meldet dann via eigenen API Änderungen am Bildschirm. Das ist das zur Zeit performanteste.

Andere Wege gehen über CUDA und Co. (also über die Grafikhardware). Aber auch hier ist man mit Java seeehr eingeschränkt. 

Alles in allem:

1) Es ist möglich mit Java Boardmitteln einen VNC Server zu schreiben
2) Das VNC Protokoll ist meines Wissens recht umfangreich. Eine eigenimplementierung ist möglich, bedarf aber entsprechenden Aufwand
3) Performance mit Java-Boardmitteln ist je nach Auflösung die es zu scrapen gilt "bedürftig" bis "grottenschlecht". 

- Alex


----------

