OkayStudy
ZH English 한국어 日本語 中文 हिन्दी বাংলা اردو Español Português Français Deutsch Русский العربية Bahasa Indonesia Tiếng Việt ไทย Türkçe

如何开启通知

此浏览器或网址无法使用通知。请使用支持通知的浏览器,通过安全连接访问SONUB。

如果通知被屏蔽,请在浏览器设置中允许通知。

  1. 打开地址栏旁的站点设置或浏览器的站点设置,将此网站的通知设为允许。
  2. 在设备设置中允许浏览器发送通知,并检查勿扰模式或专注模式。
  3. 返回SONUB,刷新页面,然后通过铃铛开启通知。

在iPhone或iPad上,将SONUB添加到主屏幕,从主屏幕打开后允许通知。

返回 Vibe 编程

Web 服务器

二十行 ,就肯跟它说话。

Web 服务器只是一个等待请求、送回响应的程序。先用 bash 和 netcat 写一个 20 行的服务器并逐行读懂,再转到自带 HTTPS 的 Caddy。

小窗口后面的店员正在听一队访客说话(一台笔记本电脑、一部手机和一个小机器人),每位访客都拿着一张请求纸条,窗口上方有一个绕圈的箭头。
Web 就像窗口里的店员:等待,读请求,递出页面,然后再等。

一份 Shell 脚本做出的 Web 服务器

下面是一台用 写成的完整 Web 服务器。它打开、读取、留下,并把 作为一份规规矩矩的 送回去。二十行,不用任何,而浏览器分辨不出差别。

重活由两个承担:(nc)负责说, 造出一个,好让我们写出的答案回到 nc 正握着的那条连接上。

server.sh
#!/bin/bash

PORT=8084
PIPE=simple-web-server-pipe

rm -f "$PIPE"
mkfifo "$PIPE"

response() {
    read -r method path _
    echo "[$(date)] $method $path" >&2
    index=$(cat index.html)
    printf 'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nConnection: close\r\n\r\n%s' \
      "$index"
}

while true; do
    response < "$PIPE" | nc -l "$PORT" > "$PIPE"
done

逐行来看

  1. PORT=8084要监听的端口。大于 1024 的号码不需要管理员,8084 也不太会和你已经在跑的东西撞上。
  2. PIPE=simple-web-server-pipe文件的名字。它在文件夹里看着像普通文件,但里面从不存东西 —— 它只是让在两个命令之间穿过去。
  3. mkfifo "$PIPE"创建命名管道(FIFO)。上一行之所以先删掉上次残留的文件,是因为 mkfifo 拒绝已经存在的文件。
  4. read -r method path _读取的第一行,拆成方法、和其余部分。之后浏览器送来的那些,这台服务器一概不看。
  5. echo "[$(date)] $method $path" >&2打印一行日志。把它送去,所以它出现在你的上,而不会混进送给浏览器的页面里。
  6. index=$(cat index.html)把里的 index.html 读进。这正是必须在那个文件所在的里启动服务器的原因。
  7. printf 'HTTP/1.1 200 OK\r\n…'写出响应:、内容类型、一个说明连接到此为止的头部,然后是空行和页面。分隔头部与内容的正是那个空行,而 要求每一行都以结束。
  8. response < "$PIPE" | nc -l "$PORT" > "$PIPE"让它跑得起来的诀窍。nc 接过 | 前面的 response 写出的响应,发给浏览器,再把浏览器的请求写进 FIFO 文件($PIPE)。response 从那个 FIFO 里读出请求,两头互相喂给对方。
  9. while true; do … done。nc 处理完一条连接就退出,没有这一行,服务器接待完一位访客就停了。
为什么要用管道,而不是一个变量

请求要先到达,函数的答案才能到达 nc —— 这是一个圈。可是 Shell 的管道只朝一个方向流。命名管道把这个圈闭合了:响应顺着管道流向 nc,请求则顺着 FIFO 绕回来。这是让两个命令双向交谈的最小办法。

自己跑一遍

把存成 server.sh,旁边放一份 index.html,然后启动它。让那个终端一直开着,再开第二个终端去发请求。

terminal
# 1. create an index.html in the same folder
echo '<h1>Hello</h1>' > index.html

# 2. save the script above as server.sh and start it
bash server.sh

# 3. open it in a browser (or check from a second terminal)
open http://localhost:8084
curl http://localhost:8084

一边刷新浏览器一边看第一个终端:每来一次请求就多一行日志。用 停下,之后如果管道文件还在就删掉它。 上的 nc 可能需要在端口前多加一个 -p; 自带的按写好的样子就能跑。

学习这里用到的 Shell 命令

这一栏由你自己标记,这里不打分。

要把这一阶段标记为已理解吗?

目前还不能取消,请在真正理解后再标记。

已标记为理解

这一栏由你自己标记,这里不打分。

请选择要取消的待付款预约。每次取消都需要确认。

你所在国家的时间:

关闭