X Window

  • 1. X是什么

X窗口系统X Window System,也常称为X11X)是一种以位图方式显示的软件窗口系统。最初是1984年麻省理工学院的研究,之后变成UNIX类UNIX、以及OpenVMS操作系统所一致适用的标准化软件工具包及显示架构的运作协议。X窗口系统通过软件工具及架构协议来创建操作系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他操作系统上。现在几乎所有的操作系统都能支持与使用X。更重要的是,今日知名的桌面环境——GNOMEKDE也都是以X窗口系统为基础建构成的。

由于X只是工具包及架构规范,本身并无实际参与运作的实体,所以必须有人依据此标准进行开发撰写。如此才有真正可用、可执行的实体,始可称为实现体。当前依据X的规范架构所开发撰写成的实现体中,以X.Org最为普遍且最受欢迎。X.Org所用的协议版本,X11,是在1987年9月所发布。而今最新的参考实现(参考性、示范性的实现体)版本则是X11 Release 7.7(简称:X11R7.7),而此项目由X.Org基金会所领导,且是以MIT授权和相似的授权许可的自由软件[1]

——引自维基百科

  • 1.1. 理解 X

对于那些熟悉其他图形环境,比如 Microsoft® Windows® 或者 Mac OS® 的用户来说,第一次使用 X 可能会感觉很惊讶。

通常您并不需要深入了解各种 X 组件的作用以及它们之间的相互影响, 不过, 了解一些关于它们的基础知识, 有助于更好地利用 X 的强大功能。

  • 1.2. 为什么要使用 X?

X 不是第一个为 UNIX® 而开发的视窗系统, 但它是最流行的。 X 的原始开发团队在开发 X 之前就已经在另外一个视窗系统上工作了。 那个系统的名字叫做 “W” (就是 “Window”)。X 只是罗马字母中 W 后面 的一个。

X 可以被叫做 “X”, “X Window 系统”, “X11”, 等等。把 X11 称做 “X Windows” 可能会冒犯某些人;

  • 1.3. X 客户机/服务器模型

X 一开始就是针对网络而设计的,所以 采用了 “client-server” 模型。在 X 模型中, “X server” 运行在有键盘,显示器,鼠标的计算机上。 服务器用来管理显示信息,处理来自键盘和鼠标的输入信息, 并与其他输入输出设备交互 (比如作为输入设备的 “tablet”, 或者作为输出设备的投影仪)。 每一个 X 应用程序 (比如 XTerm, 或者 Netscape®) 就是一个 “客户程序 (client)”。 客户程序给服务器发送信息,如 “请在这些坐标上画一个窗口”, 而服务器则返回处理信息, 如 “用户刚刚点击了 OK 按钮”。

如果您家或办公环境中只有一台使用 FreeBSD 的计算机, 就只能在同一台计算机上运行 X server 和 X client 了。 然而, 如果您有很多运行 FreeBSD 的机器, 您可以在您的桌面计算机上运行 X server, 而在比较高档的服务器上运行 X 应用程序。 在这样的环境中, X server 和 X client 之间的通信就可以通过网络来进行。

这可能会让一些人感到困惑, 因为 X 的术语和他们料想的有些不同。 他们以为 “X server” 是运行在功能强大的大型机上的,而 “X client” 是运行在他们桌面上的计算机上的。

记住,X server 是有键盘和显示器的那台计算机,而 X client 是那些显示窗口的程序。

Client 和 server 不一定都要运行在同一种操作系统上, 它们甚至无需在同一种类型的计算机上运行。 在 Microsoft® Windows® 或 Apple 公司的 Mac OS® 上运行 X server 也是可以的, 在它们上面也有很多免费的和商业化的应用程序。

  • 1.4. 窗口管理器

X 的设计哲学很像 UNIX® 的设计哲学, “tools, not policy”。这就意味着 X 不会试图去规定任务应该如何 去完成,而是,只给用户提供一些工具,至于决定如何使用这些工具是用户自己的 事情。

这套哲学扩展了 X,它不会规定窗口在屏幕上应该是什么样子,要如何移动鼠标, 应该用什么键来切换窗体 (比如, Alt+Tab按键,在 Microsoft® Windows® 环境中的作用), 每个窗口的工具条应该 看起来像什么,他们是否应该有关闭按钮等等。

实际上,X 行使了一种叫做 “窗口管理器”的应用程序的职责。有很多这样的程序可用: AfterStep, Blackbox, ctwm, Enlightenment, fvwm, Sawfish, twm, Window Maker,等等。每一个窗口管理器 都提供了不同的界面和观感;其中一些还支持 “虚拟桌面”;有一些允许您可以定制一些键来管理您的桌面; 一些有“开始” 按钮,或者其他类似的设计;一些是 “可定制主题的(themeable)”, 通过安装新的主题, 可以完全改变外观。 这些以及很多其他的窗口管理器, 都可以在 Ports Collection 的 x11-wm 分类目录里找到。

另外,KDE 和 GNOME 桌面环境都有他们自己的窗口管理器 与桌面集成。

每个窗口管理器也有不同的配置机制;有些需要手工来写配置文件, 而另外一些则可以使用 GUI 工具来完成大部分的配置任务, 举例而言, (Sawfish) 就使用 Lisp 语言书写配置文件。

  • 1.5. 窗口部件

提供工具而非策略的 X 方法使得在每个应用程序屏幕上看到的窗口部件得到了 大大的扩展。

“Widget” 只是针对用户接口中所有列举项目的一个术语,它 可以用某种方法来点击或操作;如按钮,复选框,单选按钮,图标,列表框等等。 Microsoft® Windows® 把这些叫做“控件”。

Microsoft® Windows® 和苹果公司的 Mac OS® 都有一个严格的窗口部件策略。 应用程序开发者被建议确保他们的应用程序共享一个普通的所见即所得的用户界面。 对于 X,它并不要求一个特殊的图形风格或一套相结合的窗口部件集。

这样的结果是您不能期望 X 应用程序只拥有一个普通的所见即所得的界面。 有很多的流行的窗口部件集设置,包括来自于 MIT 的 Athena, Motif® (模仿 Microsoft® Windows® 的窗口风格, 所有部件都具有斜边和3种灰色度), OpenLook, 等等。

如今, 绝大多数比较新的 X 应用程序采用一组新式的窗口设计, 这包括 KDE 所使用的 Qt, 以及 GNOME 所使用的 GTK+。 在这样一种窗口系统下,UNIX® 桌面的一些所见即所得特性作了一些收敛, 以使初学者感到更容易一些。


x-window.png

看了图是不是好理解一些

  • 如果我们使用的是一个桌面的linux(如deepin),那就是上图中的服务器,Xserver和Xclient都在同一台主机上
  • 如果我们使用的一个没有键盘、鼠标、显示器的服务器,这时又想在之上运行图形程序,那我们只要在服务上安装Xclient(一般安装时自动安装管理器会自动将依赖的库等安装上),再使用一台安装了Xserver的有键盘、鼠标、显示器的主机来连接,就可以操作服务器上的图形程序了

DISPLAY

这是一个linux的环境变量(试验机为一台deepin桌面linux电脑)
在一个桌面linux中使用env / set可以看到

env.png

那它到底是什么东西呢,看名字我们知道,显示
display.png

This information is used by the application to determine how it should connect to the server and which screen it should use by default (on displays with multiple monitors)
应用程序使用此信息来确定它默认情况下应如何连接到服务器以及哪个屏幕(在具有多个监视器的显示器上)
可以使用
export DISPLAY=hostname:displaynumber.screennumber
而上面看到的DISPLAY=:0说明Xclient会默认连接到本机的0号显示器上进行显示(也就是我们一般情况面前的显示器)

那我们再看看最上面的图,发挥一下想象力,我们可不可以

  • 在这台计算机的显示器上显示,其它主机的图形程序呢---------------------------可以
  • 将这台计算机的图形程序在,其它主机上显示呢-----------------------------------可以

是不是好很神奇,对,X就是这么的神奇

但有的人马上就会说,你在放屁,要是可以这样的话,那不是我打开一个程序,却跑到别人的电脑上去了,别人打开一个软件又跑我这里来了,这不是扯蛋吗?

不错就是这么的扯蛋,为什么平时没有发生这种事儿呢?

display2.png

看到这个Xorg的启动参数中有-nolisten tcp字样,这说明它是不会接受来自tcp的连接的,这也就是为什么我打开的程序不会跑到别人电脑上的原因,(就算我设置好的打开这个程序Xclient要在别人的电脑上显示,但别人的电脑Xserver默认是不支持远程连接啊

如果在一个最小化安装的系统上支持图形程序,网上打了好久都是说要安装桌面,但作为一个强迫症的从来说,要在一个服务器系统上安装桌面这简直就是无法接受的事...

学习了这么多关于X Window的知识,现在就可以轻松的完成了

现在来说说在 sdl vnc
在之前的Centos 虚拟化之 XEN中使用sdl,启动虚拟机失败的问题

sdl = 1
[root@localhost xen]# xl create test
Parsing config from test
libxl: error: libxl_dm.c:2184:device_model_spawn_outcome: domain 1 device model: spawn failed (rc=-3)
libxl: error: libxl_create.c:1535:domcreate_devmodel_started: device model did not start: -3
libxl: error: libxl_dm.c:2298:kill_device_model: Device Model already exited
libxl: error: libxl.c:1572:libxl__destroy_domid: non-existant domain 1
libxl: error: libxl.c:1531:domain_destroy_callback: unable to destroy guest with domid 1
libxl: error: libxl.c:1460:domain_destroy_cb: destruction of domain 1 failed
[root@localhost xen]#

这是因为这台服务器上没有安装桌面环境,没法显示出图像
如果我们这样,来看看
第一步,在要显示图像界面的电脑上开启一个Xserver(如Xmanager)

xmanager.png

第二步,将环境变量设置为要显示界面电脑的ip加桌面号,这是再来执行时就会在要显示的电脑上收到Xclient客户端的请求
xmanager1.png

第三步,同意后就能显示了
xmanager2.png

是不是So easy
这个方法就可以在一台没有桌面环境的服务器上运行图形程序,vnc同理
........
想想我是怎么找到方法的,呵呵
........


下面是引用一位 予你心安 网友的文章,写的非常好
感谢您写出这么好的文章!!!

x window的奥秘

阅读目录

大名鼎鼎的 X Window 大家肯定不陌生。都知道它是 Unix/Linux 下面的窗口系统,也都知道它基于 Server/Clinet 架构。在网上随便搜一搜,也可以找到不少 X Window 的介绍。有不少文章为了给用户留一个直观的印象,往往先让系统进入纯文本界面,然后使用 startx 来启动图形界面,或者直接使用 X 来启动 X Server,再然后运行一个 xterm 来做示范。我觉得以上这些文章对 X Window 的理解有限,不够深入,而且也不够新。所以,我这里写一篇《X Window 的奥秘》,以最新的 Ubuntu-14.04 Desktop 为例,展示如何学习 X Window。

先说一点题外话。在上一篇《打造属于自己的Vim》发表后,评论中有人让共享一下配置文件。当时我说:配置文件又不长,自己照着图片敲一下代码嘛。结果这个“照着图片敲代码”的事情我今天自己干了一遍,好在没花多少时间,几分钟而已。原因是因为我今天折腾 X Window 的时候,把系统给挂掉了,然后重装系统,然后,就只好再设置一遍 Vim 了。

了解自己机器上的 X Window

X Window 其实是一种规范,它有很多不同的实现,在 Linux 系统下最流行的是实现 Xorg 和 XFree86,微软 Windows 系统下也有 X Window 的实现,苹果的Mac 也是 X Window 的一种。要了解自己机器上运行的 X Window 究竟是哪一个,可以使用查看进程的ps命令,如下图:


image

从上图可以看出,Ubuntu 14.04 使用的 X Window 是 Xorg。如果使用 ps -ef 命令,还可以看到 Xorg 运行时的命令行参数。

想了解 X Window,下面这些文档需要看一遍先:


image

下面来说一下也许是众所周知的基础知识:X Window 是一个分层的架构,它分为 Serve 和 Client。X Server 负责图形界面的显示,(也负责用户的输入),而Client 程序需要连接到 X Server,然后请求 X Server 绘制图形界面,同时从 X Server 接受用户的输入。在桌面系统上,X Server 和 Client 程序往往安装在同一台机器上,日常使用基本感觉不到它是分层的。但是很显然,X Server 和 Client 也可以分别运行在不同的机器上,在一台机器上运行程序,而在另外一台机器上显示图形界面。

X Window 中的 Server 和 Client 的概念和我们平时接触到的“Server/Client”概念刚好相反。很多熟悉 Internet 原理的人,第一次接触 X Window 的这两个概念都会搞错。比如,我在一台本地机器上运行 Ubuntu 14.04 桌面版,而在另外一台远程机器上运行 CentOS 5.10(纯字符界面),当我用 ssh 从 Ubuntu 连接到 CentOS 的时候,Ubuntu 是 Client,而 CentOS 是 Server。在 X Window 中,Server 偏偏是我面前的这台 Ubuntu,X Server 运行在 Ubuntu 上。我可以在 CentOS 中运行 GVim,但是窗口显示在 Ubuntu 中,这时,GVim 是一个 Client 程序,它在远程机器上运行,而它的窗口显示在本地。

理解 display 和虚拟控制台

前面提到网上很多介绍 X Window 的文章都是先让系统进入字符界面,然后手动启动一个 X Server。其实这完全没有必要,因为在同一台机器上完全可以运行多个 X Server,只需要让每个 X Server 的 display 不同即可。那么 display 究竟是什么?

在 X Window 中,可以通过 hostname:display_number.screen_number 来指定一个屏幕。可以这样理解:一台计算机可以有多个 display,一个 display 可以有多个屏幕。所以,display 相当于是计算机配备的一套输入输出设备,一般情况下,一台电脑只配一套键盘鼠标和一个显示器,特殊情况下,可以配多个显示器。

现在问题出来了,我的电脑只有一套键盘鼠标和一个显示器,也就是只有一个 display,那又怎么能运行多个 X Server 呢?那是因为在 Linux 中,还有虚拟控制台这样的高级特性。只需要同时按下 Ctrl+Alt+F1、Ctrl+Alt+F2、...、Ctrl+Alt+F7,就可以在不同的虚拟控制台中进行切换。在 Ubuntu 14.04 中,虚拟控制台 1 到 6 运行的getty,也就是字符界面,虚拟控制台 7 运行的是 Xorg。(Fedora 中不一样,虚拟控制台 1 运行的是图形界面,其它的是字符界面。)

我们可以直接运行 X Server 程序来启动 X Server。/usr/bin/X 和 Xorg 都是 X Server 程序。其实 /usr/bin/X 是 Xorg 的符号链接,用哪一个都是一样的。

启动 X Server 的时候可以指定 display 参数,因为可以省略掉 hostname 和 screen_number,所以可以用 :0,:1 这样的格式来指定 display。在我的机器上,本来就有一个 X Server 在运行,display :0 已经被占用了,所以我使用 sudo X :1 -retro 来在 display :1 上再运行一个 X Server,如下图:


image

其中的 -retro 参数是为了让 X Server 的背景显示为斜纹,否则背景为纯黑色,那就看不出来是否启动了 X Server。启动 X Server 后的效果如下图:


image

按 Ctrl+Alt+F7 回到 display :0,再用 ps 命令看一下,会发现系统中有两个 Xorg 在运行,一个运行在虚拟控制台 7,一个运行在虚拟控制台 8。如下图:


image

在新启动的 X Server 中运行一个 GVim 看看效果。运行 GVim 时,使用 -display :1 参数指定窗口显示在新启动的 X Server 上,使用 -geometry 参数指定窗口的大小和位置。然后按 Ctrl+Alt+F8 切换虚拟控制台,看效果。命令见上图,程序运行效果见下图:


image

远程连接 X Server

如果能让远程机器上的 GVim 也把窗口显示在本地机器的屏幕上,那就比较过瘾了。所以,使用 ssh 连接到 CentOS-5.10,然后使用 gvim -display ubuntu-14:1 命令,希望将 GVim 显示到 Ubuntu 的 display :1 上。由于是远程连接,所以 hostname 不能省略,需写成 ubuntu-14:1,也可以使用 IP 地址,写成 192.168.1.103:1。如下图:


image

很可惜,连接失败。

失败的原因是远程访问 X Server 需要安全认证。这个可以理解,就像登陆邮箱需要输入用户名和密码一样,如果 X Server 不要认证就可以随便连接的话,那岂不是桌面上垃圾窗口满天飞?安全认证的方式有很多种,具体请参考 man Xsecurity。安全认证可以使用 xhost 和 xauth 这两个程序来进行,具体使用方法参考它们的文档。

先用 xhost 来授权,这个比较简单。为了运行 xhost,需要在 X Server 上有一个终端,所以运行一个 xterm,如下图:


image

在 xterm 中输入 sodu xhost +192.168.1.109,这样,CentOS-5.10 中运行的 GUI 程序都可以连接到这个新开启的 X Server 了。如下图:


image

在 CentOS-5.10 中运行 GVim,如下图:


image

窗口显示在 Ubuntu 中,如下图:


image

新启动的 X Server 界面比较丑陋,我们还是想让远程机器上的 GUI 程序直接显示在 Ubuntu 的桌面环境中。所以,指定 display 为 :0,如下图:


image

结果很不幸,无法打开 display。连接不上,为什么呢?是安全认证的问题吗?不是,是 lightdm 的问题,请继续往下看。

理解 lightdm 和 X Window 桌面环境的启动过程

X Server 的启动方式有两种,一种是通过显示管理器启动,另一种是手动启动。在前面的例子中,我通过直接运行 /usr/bin/X :1 来启动了一个 X Server。直接启动 X Server 的方法还有运行 startx 或者 xinit。手动启动 X Server 的缺点就是启动的 X Server 不好看。而显示管理器启动的不仅有 X Server,还有一大堆的 Client 程序,构成了一个完整的桌面环境,界面当然就漂亮多了。

显示管理器(Display Manager)是什么呢?前面我讲到 display 就是一个电脑配备的一套键盘鼠标和显示器,那么显示管理器就是这一套设备的管理器了。显示管理器可以直接管理这些设备,所以它可以控制 X Server 的运行,由它来启动 X Server 那是再合适不过了。系统启动过程是这样的:内核加载-->init程序运行-->显示管理器运行--> X Server 运行-->显示管理器连接到 X Server,显示登录界面-->用户登录后,登录界面关闭,加载桌面环境。从上面的流程可以看出,显示管理器是 X Server 的父进程,它负责启动 X Server,当 X Server 启动后,它又变成了 X Server 的一个 Client 程序,连接到 X Server 显示欢迎界面和登录界面,最后,显示管理器又是所有桌面环境的父进程,它负责启动桌面环境需要的其它 Client 程序。

在 Ubuntu 14.04 中,使用 lightdm 取代了传统的 xdm、gdm 等显示管理器。简单来说,就是由 lightdm 负责启动 X Server 和其它的 X 程序。不知道为什么,lightdm 在启动 X Server 的时候,给 X Server 加上了 -nolisten tcp 参数,所以远程计算机就没有办法连接到 Ubuntu 的桌面了。(从第 1 张图片可以看到该参数。)

下一步的目标就是更改 lightdm 的配置,去掉这个 -nolisten tcp 参数。不过要达成这个目标还真是艰难啊,我的系统挂掉然后重装就是在这里折腾出来的。在这里我要狠狠滴吐槽一下 freedesktop.org,在 X Window 所用的软件中,freedesktop.org 贡献很大,比如 lightdm、xft、fontconfig、freetype 都是这个组织贡献的,可是,你就不能把文档写详细点吗?不仅是 lightdm 的文档不行,xft、freetype 的文档也都不行。

lightdm 的 man page 非常简略,使用 sudo dpkg -L lightdm 也找不出该软件包中有价值的东西。没办法,另辟蹊径吧。在使用 sudo dpkg -L lightdm 查看该软件包的文件时,发现它的 log 文件放在 /var/log/lightdm 文件夹下,过去看看:


image

终于,从 log 文件中看到了 lightdm 启动的全过程。首先,看到它从哪几个目录加载配置文件,接着,看到它启动 X Server。从下图光标所在的行可以看到 X Server 启动的所有参数,包括 -nolisten tcp 选项。


image

继续看 log 文件,下面光标所在的行显示 lightdm 怎么启动 gnome-session:


image

同时,我发现 /etc/lightdm/ 目录下没有 lightdm.conf 文件,而 /usr/share/doc/lightdm/ 目录下有一个 lightdm.conf.gz 文件,把该文件当文档看了一下,发现里面果然就是 lightdm 的配置的解释。赶快将该文件复制到 /etc/lightdm/ 目录下并解压,如下图:


image

然后用 Vim 编辑 /etc/lightdm/lightdm.conf 文件,将 xserver-allow-tcp=false 一行前面的注释去掉,并且改为 xserver-allow-tcp=true。如下图:


image

最后,重启系统。再用 ps 查看进程,发现 -nolisten tcp 选项已经没有了。


image

搞定 xauth

搞定了 -nolisten tcp 之后,要想从远程计算接连接到 Ubuntu 桌面,还是需要安全认证。在前面的例子中,我使用了 xhost。xhost 是最简单的认证方式。在这里我要试一下别的认证方式,比如 MIT-MAGIC-COOKIE-1。如上图,先使用 xauth list 命令查看一下当前的授权记录,发现只有一条,而且 display 是 ubuntu-14/unix:0,很显然,这是一个本地授权,所以需要使用 xauth add 命令添加一个使用 ip 地址的授权,后面的 key 照抄就行了。最后,使用 xauth extract 和 xauth merge 配合管道和 ssh 将该授权记录合并到 CentOS-5.10 中。

在 CentOS-5.10 中启动 GVim,指定 display 为 192.168.1.103:0,GVim 窗口就出现在了 Ubuntu中。如下图:


image

X Server 的配置

可以使用不同的方法对 X Server 进行配置,前面的例子是直接指定命令行参数。除了指定命令行参数,还可以使用环境变量和配置文件。X Server 的配置文件为一般是 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d/ 目录下的 .conf 文件,当然,配置文件也可以放在其它的目录中,具体信息,请参看 man xorg.conf。

如果没有配置文件,X Server 将在启动的时候自动检测硬件,然后生成一个内置的配置。Ubuntu 系统就没有配置文件。不过没关系,如果需要使用配置文件的时候,可以通过 X Server 的 -configure 参数生成一个配置文件,里面包含当前自动检测出的配置。如果需要任何个性化的配置,对该文件进行修改即可。

现有的图形界面中可以运行嵌套的 X Server

我们上面运行的 X Server 都是直接占用了计算机的整个显示器和键盘鼠标,事实上,在现有的图形界面中,还可以以窗口模式运行另外一个 X Server,称为 nested X Server。最常用的 nested X Server 是 Xephyr,在 Ubuntu 中可以通过如下命令安装它:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">sudo的安装资质的Xserver,xephyr</pre>

Xephyr 的使用非常简单,可以通过 man Xephyr 命令查看它的使用手册。如果输入 Xephyr :1 命令,就可以在现有图形界面中打开一个窗口模式的 X Server,如下图:


image

以后再启动 GUI 程序,就可以通过程序的 -display 选项让程序运行在这个嵌套的 X Server 中,如下图:


image

怎么样,是不是很好玩呢?除了好玩,还很有用,比如调试窗口管理器啊、连接远程桌面啊什么的都用得着。当然,我这里只是简单展示一下原来 X Window 还可以这么玩。

总结:

1.在一个 Linux 系统中存在多个虚拟控制台,所以可以启动多个 X Server;

2.启动 X Server 的方式有两种,一种是使用 /usr/bin/X、startx、xinit 手动启动,一种是通过显示管理器启动;

3.Ubuntu 使用的显示管理器是 lightdm,这是一个比较新的、轻量级的显示管理器,但是文档不够详细;

4.远程计算机连接本地的 X Server,需要 X Server 开放 TCP 端口,还要搞定安全认证;

5.X Server 的配置,可以通过命令行参数,可以通过环境变量,还可以通过配置文件;

6.可以在现有的图形界面下以窗口模式运行嵌套的 X Server,常用的软件是 Xephyr;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容