上一篇中我们最后有提到如何将服务器上的UI图片显示在本地,这一期来补上这个坑。

前言

熟悉Windows和macOS的同学在第一次使用X的时候可能会感到惊讶,因为这与传统的显示方式有所不同。普通人可能会直观的认为操作系统就应该是用户界面+软件内核的形式,但是也诧异Linux可以在不依赖图形界面的情况下工作,同时也可以加载不同的图形界面。熟悉linux的同学可能也对命令行习以为常了,但是并不知道这个图形界面是如何实现的以及为什么要这样设计。

client-server模型

X采用client-server模型,这些模型与我们常见的client-server模型有所不同,常见的client-server结构中,称提供服务的一方为server,即服务器端(如HTTP服务,FTP服务 等),使用服务的称为client,即客户端。但在X中,client是执行程序的一方,在上面执行各种X程序,而server则是负责显示client运行程序的窗口的一方。

X windows,笼统的称为X,是一种位图显示的视窗系统,是建立图形用户界面的标准工具包和协议。X 是协议,不是具体的应用程序。X 为GUI环境提供了基本的框架:在屏幕上绘图、移动视窗以及与鼠标键盘的互动。现在多用x11版本,X11R6全称为X protocol version 11 release 6。X11使用户可以运行基于X11的应用程序。每一个应用程序就是一个client,而server则是鼠标键盘所在的计算机。

client-server之间的信息传递

这个结构的设计主要是为了网络传输而设计的,而client和server之间的通信是通过X Protocol通讯协议进行的,假如client-server在同一台计算机上,那么X Protocol可以通过操作系统内部通信协议实现,而假如不在同一台计算机上,可以使用网络通讯协议,例如TCP/IP协议进行。

通常设置显示TCP/IP通讯的时候,都会为应用程序指定IP:port,同理,X也是这样的但是也有所不同,我们常见的X的端口会设置成localhost:0.0这样,其实这是X特殊的设计,因为考虑到一台计算机会有多个图形界面,而一个图形界面会有多个显示器,所以0.0表示第一个图形界面,第一个显示器。同理10.0表示第11个图形界面,第一个显示器。

X的广泛使用

在Linux和macOS下的图形界面都是基于X实现的,常见的Linux的X client有非常多的种类和花样,如CDE,GNOME,KDE,Xfce等等,在Windows上常用的X server有Xming等。

VSCode远程使用X11

通过上面我们知道,鼠标键盘所在的计算机是X server,而应用程序是X client,所以只要在Windows系统上安装X server程序就可以将远程计算机的应用程序显示在本地了。

下载Xming

下载链接:https://sourceforge.net/projects/xming/files/latest/download

安装完成后,打开Xming。
注:后面的步骤中,默认Xming是打开状态,如果不显示窗口,检查Xming是否已经打开。

使用支持X11协议的ssh工具连接Xming

例如MobaXterm:https://mobaxterm.mobatek.net/

假如使用windows自带的powershell需要设置一下:
1). 首先输入$env:DISPLAY='localhost:0.0',设置参数。
2). 然后使用命令连接服务器 `ssh -XY name@192.168.xx.xx 连接服务器,其中name换成你的用户名,后面ip换成你的服务器的ip

接着启动一个图形程序,例如xclock,就可以显示出来了。
Xwindow-2022-03-04-18-02-58

在vscode上使用X11

首先,我们需要打开ssh的config文件,在里面添加如下三个参数

1
2
3
ForwardX11 yes
ForwardX11Trusted yes
ForwardAgent yes

接着配置秘钥登陆,不知道怎么配置的,看这里:https://www.luodeb.top/729730d3

然后连接上服务器,安装两个插件,在本地计算机安装Remote X11 (SSH)插件。
Xwindow-2022-03-04-18-06-27

在远程服务器安装 Remote X11
Xwindow-2022-03-04-18-07-13

接着打开vscode的终端,输入xclock就可以看到图形程序了,或者在使用python时候,使用x11显示matplotlib等图片。

随便在服务器上编写一个python文件,如:

1
2
3
4
5
import matplotlib.pyplot as plt

a = [1,2,3,4,5,6]
plt.plot(a)
plt.show()

Xwindow-2022-03-04-18-11-03

这样,就成功显示了远程图片了,开始远程敲代码之旅吧,摆脱又卡又慢的远程桌面吧。