🔌 第六章 请求到达Web服务器,响应返回浏览器
📄 一句话概括

服务器端套接字四步:socket 造、bind 报端口、listen 挂营业牌、accept 接客——客到之后复制一个新套接字专门陪客,原套接字继续监听。

📝 本节和前面几节的关系

6.1.2 说了要多任务;本篇看多任务的具体机制——套接字怎么管理。

一、四个函数

socket():造一个套接字(与客户端相同); bind():报上端口号(如 80)——这是服务器的身份证; listen():挂上【营业中】的牌子开始等; accept():有连接来就接受,返回新套接字。

二、复制套接字

accept 后复制出一个新套接字专门陪这位客, 原来的继续监听等下一批—— 这就回答了【一人等客怎么不堵门】。

三、动手 Demo:服务器端的套接字流程

与客户端(socket->connect)对仗的四个函数:

for s in ['socket()  造一个套接字',
    bind()    报上端口号(80)',
    listen()  挂上【营业中】的牌子等客',
    accept()  有客来了,接进来']:
    print(s)
print()
print('客一到,再复制一个套接字专门陪这位客')

实跑输出:

--------------------------------------------------------------------
服务器端的套接字流程
--------------------------------------------------------------------
  与客户端(socket->connect)对仗的四个函数:

    socket()  造一个套接字
    bind()    报上端口号(80)
    listen()  挂上【营业中】的牌子等客
    accept()  有客来了,接进来

  客一到,再**复制一个套接字**专门陪这位客,
  原来的继续在门口等下一批。

对照 1.4.2~1.4.4 的客户端四阶段—— 两边的函数一一对应,pipe 才接得起来。

30 秒实验

  1. 写出服务器与客户端的函数调用序列对照表。
  2. 想想为什么不复制套接字会发生什么。
  3. 查查 Python socket 编程里 accept 的返回值。

常见误区

  1. 以为服务器一个套接字包办所有客人——accept 会复制新的。
  2. 以为 bind 是客户端的事——端口号是服务器的门牌。
自测三问(点开对答案) 1. 服务器端四步函数? —— socket、bind、listen、accept。 2. accept 返回什么? —— 专门陪这位客的新套接字。 3. bind 的作用? —— 把端口号报给协议栈。

相关笔记