实现这个目标需要四步。
- Step 1. 创建虚拟屏幕
- Step 2. 将指定屏幕交互转为VNC协议传输
- Step 3. 将VNC协议传输转为浏览器交互
- Step 4. 在虚拟屏幕运行GUI程序
Step 1~2
Step 1和Step 2之所以没有分开,是因为有很多工具把这两步合在一起的。
实现Step 1和2的工具有很多,可以参考ubuntu/VNC/Servers。
这里不一一列出,主要讲一下xvfb
、tightvncserver
、tigervnc
的几种组合。
xvfb
只能实现Step 1tightvncserver
支持Step 1和Step 2tigervnc
支持Step 1和Step 2,通过不同的程序实现对应功能
xvfb
+ tigervnc
本来经典的是 xvfb
+ x11vnc
,但是x11vnc
太老了,想要使用还需要些额外的操作,所以不提了。
# 安装 xvfb
sudo apt-get install xvfb
# 启动xvfb模拟虚拟屏幕2 下面的参数24指的是色彩深度
Xvfb :2 -screen 0 1280x720x24
# 安装 tigervnc
sudo apt-get install tigervnc-scraping-server
# 启动x0vncserver将虚拟屏幕2暴露给端口5902(VNC协议)
## 参数可以查看 https://tigervnc.org/doc/x0vncserver.html
x0vncserver -localhost no -rfbport=5902 -PasswordFile=/home/lijia/.vnc/passwd -display :2
# 密码文件可以有 vncpasswd生成,一般保存在~/.vnc/passwd
# 关闭可以直接 kill -2 [pid]
tigervnc
# 安装 tigervnc
sudo apt-get install tigervnc-standalone-server
# 启动Xvnc 新建虚拟屏幕2并暴露给端口5902(VNC协议)
## 参数可以查看 https://tigervnc.org/doc/Xvnc.html
Xvnc --localhost -rfbport=5902 -PasswordFile=/home/lijia/.vnc/passwd -geometry 1280x720 :2
# 密码文件可以有 vncpasswd生成,一般保存在~/.vnc/passwd
# 关闭可以直接 kill -2 [pid]
tightvncserver
# 安装 tightvncserver
sudo apt-get install tightvncserver
# 启动tightvncserver 新建虚拟屏幕2并暴露给端口5902(默认端口为 5900 + 2)
tightvncserver -localhost -depth 16 -geometry 1280x720 :2
# 关闭屏幕2
tightvncserver -kill :2
看具体的目的吧,以上需要注意是不是监听本地localhost,防止暴露
Step 3
使用noVNC。拷贝项目源码即可运行。
如果没有git环境的话,还需要将websockify的源码拷贝并解压到utils/websockify
。
# utils/novnc_proxy中,有这样一段代码,其中${HERE}指的是 novnc_proxy 所在目录
git clone https://github.com/novnc/websockify ${HERE}/websockify
接下来就是运行了。需要注意的是,如果不监听本地的话,必须开启ssl。
./noVNC-1.4.0/utils/novnc_proxy --vnc localhost:5902 --listen localhost:8787
./noVNC-1.4.0/utils/novnc_proxy --vnc localhost:5902 --listen 8787 --cert /home/lijia/cert.pem --key /home/lijia/cert.key --ssl-only
Step 4
主要是设置环境变量DISPLAY
export DISPLAY=":2"
java -jar gui_app.jar