SONUB 首页 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 编程
VIBE 编程

Web 客户端

所有向开口要东西的一方。

Chrome 是 Web ,一行 也是。这一章里你会做四件事。你会亲手写一份 ,把它包成 脚本,再认真学会 curl。最后打开 Chrome ,看着同样的文字在眼前飞过。

在终端里做一个 Web 客户端

要最快地相信 只是文字,就自己动手打一份请求出来。先把上一主题里的 Shell 服务器跑起来,再开第二个,亲手跟它说话。

用 nc 手写一份请求

连上端口,把你敲的字原样送上线路。打完两行、按两次回车,服务器就会回答 —— 你刚刚亲手做了浏览器的活。

terminal
# connect, then type the two lines below and press Enter once more
nc localhost 8084

GET / HTTP/1.1
Host: localhost

# or send it all at once (printf's \r\n is HTTP's line break;
# sleep keeps the line open a moment so the shell server can answer)
{ printf 'GET / HTTP/1.1\r\nHost: localhost\r\n\r\n'; sleep 1; } | nc localhost 8084
  • 结尾那个空行很重要。它告诉服务器请求到此为止,所以你要多按一次回车。
  • HTTP 要求每行以回车加换行结束。手打也能通,是因为多数服务器比较宽容;而 printf 那一版送出的正是标准所要求的样子。
  • Host 那一行是 HTTP/1.1 强制要求的。对着真实站点少写它,通常换回来的是一个错误,而不是页面。

把它包成脚本

既然请求已经只是一句 printf,一个可以反复用的客户端也就是几行的事。下面这份接收主机、端口和路径,送出请求,并把和正文分开显示。

client.sh
#!/bin/bash
# usage: bash client.sh localhost 8084 /

HOST=${1:-localhost}
PORT=${2:-8084}
PATH_=${3:-/}

{ printf 'GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n' "$PATH_" "$HOST"; sleep 1; } \
  | nc "$HOST" "$PORT" \
  | tr -d '\r' \
  | awk 'BODY { print; next } /^$/ { BODY = 1; next } { print "[header] " $0 }'

tr 去掉 HTTP 留在每行末尾的回车,awk 则在遇到空行之前把每行都标成头部 —— 空行之后的一切都是正文。这跟浏览器开始绘制之前所做的切分完全一样。

把两头一起跑起来

一个终端跑 Shell 服务器,另一个跑这个客户端,你就同时握有一场自己写出来的对话的两端。发给 Shell 服务器时,要像上面的那样用 sleep 让连接多开一会儿,才收得到回答。改一改服务器的,客户端立刻就看得见 —— 因为中间再没有别的东西。

回到 Shell Web 服务器

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

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

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

已标记为理解

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