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

如何开启通知

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

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

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

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

我的学习进度
  1. 人工智能用法
  2. 终端命令
  3. 人工智能进阶
  4. Vibe 编程
  5. 人工智能证书 准备中
  6. 键盘
查看详情
返回 Vibe 编程
VIBE 编程

Web 服务器

二十行 Shell,浏览器就肯跟它说话。

Web 服务器不过是一个等待请求、送出响应的程序。为了证明这一点,我们只用 bash、netcat 和一个命名管道做一台出来 —— 每一行你都读得懂。之后再走向 Caddy,那是连 HTTPS 一起带上、真正跑线上站点的服务器。

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

下面是一台用 bash 写成的完整 Web 。它打开、读取请求行、留下日志,并把 index.html 作为一份规规矩矩的 响应送回去。二十行,不用任何,而分辨不出差别。

重活由两个命令承担:netcat(nc)负责说网络,mkfifo 造出一个命名管道,好让我们写出的答案回到 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…'写出响应:状态行、内容类型、一个说明连接到此为止的头部,然后是空行和页面。分隔头部与内容的正是那个空行,而 HTTP 要求每一行都以回车加换行结束。
  8. response < "$PIPE" | nc -l "$PORT" > "$PIPE"让它跑得起来的诀窍。nc 从管道里读出我们的响应,又把浏览器的请求写回管道,两头互相喂给对方。
  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

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

学习这里用到的 Shell 命令

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

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

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

已标记为理解

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

学习指南

人工智能

人工智能资格证

学习

Vibe 编程

游戏开发

练习

导师

聊天

论坛

创作

社区

更多

术语词典

选一个你不认识的词吧,可以看到简单的解释和相关术语。

还没有匹配的术语。

选择一个术语即可查看解释。