Protocol RFB is used by VNC servers and clients to share and give control of remote desktop. This is server-side Java library.
To build this library, use maven command:
mvn install
Then add it to your project, into pom.xml file as dependency:
<dependency>
<groupId>com.scoreunit.rfb</groupId>
<artifactId>service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
Alternatively, if you don't use maven to manage dependencies, just copy source code into your project.
To start VNC service and wait for VNC viewer to connect:
final RFBService service = new RFBService();
service.start();
RFB service will listen on default TCP port 5900.
To start VNC service on another TCP port:
final RFBService service = new RFBService(1234);
service.start();
RFB service will listen on TCP port 1234.
To start VNC service and share only part of screen use ScreenClip object:
final RFBService service = new RFBService();
service.setScreenClip(0, 0, 800, 600);
service.start();
RFB service will use part of screen, 800x600 pixel, instead of full screen.
To start VNC service with configured password, use setPassword(String) method:
final RFBService service = new RFBService();
service.setPassword("mySecret123");
service.start();
RFB service will ask VNC client to enter correct password.
To start VNC service and override client preferred encoding of screen:
final RFBService service = new RFBService();
service.setPreferredEncodings(new int[]{Encodings.ZLIB, Encodings.HEXTILE});
service.start();
RFB service will use preferred encodings set to ZLIB and HEXTILE.
To start VNC service and connect to VNC client which is in listening mode, use:
final RFBService service = new RFBService();
service.connect("my-client-1", 5550);
RFB service will start and establish TCP connection to VNC client my-client-1 listening at TCP port 5500.
Example class RFBServiceExample provides demo code and allows RFB service library to start as stand-alone Java program.
Command line arguments:
RFB service
Usage:
--port [tcp port]
Bind to specific TCP port, and wait for VNC client. Default TCP port is 5900.
--connect [hostname:port]
Establish connection to VNC client. Default TCP port is 5500.
--clip [width+height]
Share only part of screen. Eg. 800+600 to share 800x600 pixels of screen, at (0,0) pixel offset.
--password [secret]
Set VNC auth. When VNC client connects, it will have to provide correct password.
Author: [email protected]
Use command line switch --help to identify all available options.
Table shows which VNC client programs have been used to test this library.
VNC Client | Version | Operating System | Encodings | Result |
---|---|---|---|---|
RealVNC Viewer | 6.20.113 (r42314) x86 | Windows XP (x86) | raw, hextile | OK |
TightVNC Viewer | 1.3.10.0 (x86) | Windows XP (x86) | raw, hextile, zlib | OK |
UltraVNC Viewer | 1.2.4.0 (x86) | Windows XP (x86) | raw, hextile, zlib | OK |
RealVNC Viewer | 4.1.1 for X (amd86) | Linux Mint (x64) | raw, hextile | OK |
SSVNC Viewer | 1.0.29 (amd86) | Linux Mint (x64) | zlib, tight | OK |
noVNC JS client | 1.2.0 | V8.8.5.210.26 | tight | OK |
Note that some combinations of colour depth, bits per pixel, etc. might not work well or will not work at all. For example, with TightVNC viewer, if bgr233 8-bit colour mode is selected, then use encoding raw or zlib. RealVNC viewer should use options -AutoSelect=0 with -LowColourLevel=1 and -PreferredEncoding=raw to correctly use low colour mode.
RFB service library supports SSL secure communication. To enable SSL support, generate private key and certificate.
To generate a private key and certificate (self-signed), use openssl utility.
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost' -nodes
openssl pkcs12 -export -inkey key.pem -in cert.pem -out final_result.pfx
First command will build key.pem file, and certificate cert.pem with example CN attribute set to localhost.
Second command will bundle key and certificate into PKCS12 format, in this example into final_result.pfx file.
If Java keytool program is available, it is possible to generate JKS key store file.
keytool -genkeypair -keyalg rsa -keysize 4096 -keystore mystore.jks -storepass blabla123 -storetype jks -v
In this example chosen key store file name is mystore.jks with password blabla123 and default validity period of 90 days.
Enabling SSL support should be easy.
final RFBService service = new RFBService();
service.enableSSL(sslKeyFilePath, sslKeyFilePassword);
Note that some VNC client programs do not support SSL secure communication at all. SSL communication has been tested with ssvnc VNC client program.
Please feel free to suggest new ideas, improvements, bug-fixes, etc.
The ideas presented here are not for commercial or production use. Please contact author if you need to use this library in a commercial product.
Author: [email protected]