mirror of
https://gitee.com/coder-xiaomo/notes
synced 2025-01-11 20:18:16 +08:00
115 lines
45 KiB
HTML
115 lines
45 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<meta name="generator" content="VuePress 2.0.0-beta.27">
|
||
<link rel="icon" href="/images/logo.png"><link rel="stylesheet" href="/css/search.css"><title>第一期学习活动 | Coz的学习笔记</title><meta name="description" content="这是我的第一个 VuePress 站点">
|
||
<link rel="preload" href="/assets/js/runtime~app.68eb4f6b.js" as="script"><link rel="preload" href="/assets/css/styles.792c48da.css" as="style"><link rel="preload" href="/assets/js/567.6fcf9384.js" as="script"><link rel="preload" href="/assets/js/app.b8559c28.js" as="script">
|
||
<link rel="stylesheet" href="/assets/css/styles.792c48da.css">
|
||
</head>
|
||
<body>
|
||
<div id="app"><!--[--><div class="theme-container"><!--[--><header class="navbar"><div class="toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a href="/" class=""><!----><span class="site-name can-hide">Coz的学习笔记</span></a></span><div class="navbar-links-wrapper" style=""><!--[--><!--]--><nav class="navbar-links can-hide"><!--[--><div class="navbar-links-item"><a href="/" class="nav-link" aria-label="首页"><!--[--><!--]--> 首页 <!--[--><!--]--></a></div><div class="navbar-links-item"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="目录"><span class="title">目录</span><span class="arrow down"></span></button><button class="mobile-dropdown-title" type="button" aria-label="目录"><span class="title">目录</span><span class="right arrow"></span></button><!--[--><ul style="display:none;" class="nav-dropdown"><!--[--><li class="dropdown-item"><a href="/guide" class="nav-link" aria-label="目录"><!--[--><!--]--> 目录 <!--[--><!--]--></a></li><li class="dropdown-item"><!--[--><h4 class="dropdown-subtitle"><span>笔记</span></h4><ul class="dropdown-subitem-wrapper"><!--[--><li class="dropdown-subitem"><a href="/computer-networks" class="nav-link" aria-label="计算机网络"><!--[--><!--]--> 计算机网络 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/data-structures" class="nav-link" aria-label="数据结构"><!--[--><!--]--> 数据结构 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/algorithms" class="nav-link" aria-label="算法"><!--[--><!--]--> 算法 <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="dropdown-item"><!--[--><h4 class="dropdown-subtitle"><span>其他</span></h4><ul class="dropdown-subitem-wrapper"><!--[--><li class="dropdown-subitem"><a aria-current="page" href="/web-server/" class="router-link-active router-link-exact-active nav-link router-link-active" aria-label="Web服务器"><!--[--><!--]--> Web服务器 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/temp-docs/" class="nav-link" aria-label="临时文档"><!--[--><!--]--> 临时文档 <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><!--]--></ul><!--]--></div></div><!--]--></nav><!--[--><!--]--><button class="toggle-dark-button" title="toggle dark mode"><svg style="" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg style="display:none;" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><form class="search-box" role="search"><input type="search" placeholder="在笔记中搜索一下..." autocomplete="off" spellcheck="false" value><!----></form></div></header><!--]--><div class="sidebar-mask"></div><!--[--><aside class="sidebar"><nav class="navbar-links"><!--[--><div class="navbar-links-item"><a href="/" class="nav-link" aria-label="首页"><!--[--><!--]--> 首页 <!--[--><!--]--></a></div><div class="navbar-links-item"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="目录"><span class="title">目录</span><span class="arrow down"></span></button><button class="mobile-dropdown-title" type="button" aria-label="目录"><span class="title">目录</span><span class="right arrow"></span></button><!--[--><ul style="display:none;" class="nav-dropdown"><!--[--><li class="dropdown-item"><a href="/guide" class="nav-link" aria-label="目录"><!--[--><!--]--> 目录 <!--[--><!--]--></a></li><li class="dropdown-item"><!--[--><h4 class="dropdown-subtitle"><span>笔记</span></h4><ul class="dropdown-subitem-wrapper"><!--[--><li class="dropdown-subitem"><a href="/computer-networks" class="nav-link" aria-label="计算机网络"><!--[--><!--]--> 计算机网络 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/data-structures" class="nav-link" aria-label="数据结构"><!--[--><!--]--> 数据结构 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/algorithms" class="nav-link" aria-label="算法"><!--[--><!--]--> 算法 <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="dropdown-item"><!--[--><h4 class="dropdown-subtitle"><span>其他</span></h4><ul class="dropdown-subitem-wrapper"><!--[--><li class="dropdown-subitem"><a aria-current="page" href="/web-server/" class="router-link-active router-link-exact-active nav-link router-link-active" aria-label="Web服务器"><!--[--><!--]--> Web服务器 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/temp-docs/" class="nav-link" aria-label="临时文档"><!--[--><!--]--> 临时文档 <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><!--]--></ul><!--]--></div></div><!--]--></nav><!--[--><!--]--><ul class="sidebar-links"><!--[--><!--[--><p class="sidebar-heading sidebar-item">第一期学习活动</p><ul class=""><li><!--[--><a aria-current="page" href="/web-server/#第1天" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="第1天"><!--[--><!--]--> 第1天 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/web-server/#任务-web服务器基本工作原理学习" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="任务:Web服务器基本工作原理学习"><!--[--><!--]--> 任务:Web服务器基本工作原理学习 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#第2天" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="第2天"><!--[--><!--]--> 第2天 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/web-server/#任务-http协议学习-f12-wireshark抓包" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="任务:HTTP协议学习 & F12 & wireshark抓包"><!--[--><!--]--> 任务:HTTP协议学习 & F12 & wireshark抓包 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-1" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#第3天" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="第3天"><!--[--><!--]--> 第3天 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/web-server/#任务-套接字编程基础知识" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="任务:套接字编程基础知识"><!--[--><!--]--> 任务:套接字编程基础知识 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-2" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#★-第4天" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="★ 第4天"><!--[--><!--]--> ★ 第4天 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/web-server/#任务-编写一个tcp-client-发出一个简单的http请求" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="任务:编写一个TCP Client,发出一个简单的HTTP请求"><!--[--><!--]--> 任务:编写一个TCP Client,发出一个简单的HTTP请求 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-3" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#★-第5天" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="★ 第5天"><!--[--><!--]--> ★ 第5天 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/web-server/#任务-编写一个tcp-server-发出一个简单的http响应" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="任务:编写一个TCP Server,发出一个简单的HTTP响应"><!--[--><!--]--> 任务:编写一个TCP Server,发出一个简单的HTTP响应 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-4" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#★-第8天" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="★ 第8天"><!--[--><!--]--> ★ 第8天 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/web-server/#任务-改造tcp-server-发送一个html文件" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="任务:改造TCP Server,发送一个HTML文件"><!--[--><!--]--> 任务:改造TCP Server,发送一个HTML文件 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#★-第9天" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="★ 第9天"><!--[--><!--]--> ★ 第9天 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/web-server/#任务-使用多线程" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="任务:使用多线程"><!--[--><!--]--> 任务:使用多线程 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-5" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#第10天" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="第10天"><!--[--><!--]--> 第10天 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/web-server/#任务-设计并使用配置文件" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="任务:设计并使用配置文件"><!--[--><!--]--> 任务:设计并使用配置文件 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-6" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-7" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-8" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-9" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/web-server/#作业-10" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="作业"><!--[--><!--]--> 作业 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li></ul><!--]--><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="page"><!--[--><!--]--><div class="theme-default-content"><!--[--><h1 id="第一期学习活动" tabindex="-1"><a class="header-anchor" href="#第一期学习活动" aria-hidden="true">#</a> 第一期学习活动</h1><h2 id="第1天" tabindex="-1"><a class="header-anchor" href="#第1天" aria-hidden="true">#</a> 第1天</h2><h3 id="任务-web服务器基本工作原理学习" tabindex="-1"><a class="header-anchor" href="#任务-web服务器基本工作原理学习" aria-hidden="true">#</a> 任务:Web服务器基本工作原理学习</h3><p>学习资料: 1、https://www.cnblogs.com/BOHB-yunying/articles/10911192.html</p><p>2、《Web工作原理》见附件</p><p>作业:写一篇小短文,发布在星球,小短文中需要回答几个问题</p><p>一个web服务器,最基本的由哪几个核心组件组成?</p><p>讲述一下,web服务器从收到一个请求,到完成这个请求的响应,主要流程是什么?</p><p>将自己理解的Web服务器工作原理,绘制一张图</p><p>附件:<a href="/web-server/files/day1-Web%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86.pdf">Web工作原理.pdf</a></p><h3 id="作业" tabindex="-1"><a class="header-anchor" href="#作业" aria-hidden="true">#</a> 作业</h3><p>看了一下网上搜索出来的感觉大都很专业,我就说说我自己的看法叭</p><p>web服务器组件我理解的是包含以下部分</p><ul><li>配置文件、默认错误页面(像404, 500等错误页模板)</li><li>日志记录模块</li><li>端口监听模块</li><li>业务处理模块</li><li>请求响应模块</li><li>扩展模块(如反向代理等)</li></ul><p>web服务器主要完成以下几件事</p><ol><li><p>监听到客户端发来的请求</p><p>涉及到计算机网络结构方面的知识</p></li><li><p>处理请求</p><ol><li><p>取得请求方法(GET, POST, PUT等),解析url,进行路由</p></li><li><p>通过路由知道客户端的请求</p><p>分成静态、动态两类,静态资源直接返回给客户端就行了,动态资源需要去对应提供服务的业务取得(像php, java, asp.net等等)</p></li></ol></li><li><p>将响应返回给用户 响应头中还包含一些扩展信息(像web服务器版本信息,MIME,缓存配置信息,静态资源还会有修改时间)</p></li></ol><p><img src="/assets/img/day1-How-the-Web-server-works.200e1050.svg" alt="Web服务器工作原理"></p><h2 id="第2天" tabindex="-1"><a class="header-anchor" href="#第2天" aria-hidden="true">#</a> 第2天</h2><h3 id="任务-http协议学习-f12-wireshark抓包" tabindex="-1"><a class="header-anchor" href="#任务-http协议学习-f12-wireshark抓包" aria-hidden="true">#</a> 任务:HTTP协议学习 & F12 & wireshark抓包</h3><p>学习资料: https://www.ruanyifeng.com/blog/2016/08/http.html</p><p>https://zhuanlan.zhihu.com/p/77376952</p><p>https://haokan.baidu.com/v?pd=wisenatural&vid=9883591515530208938</p><p>作业:写一篇小短文,发布在星球,完成下面这些内容</p><ul><li>HTTP请求主要由哪几个部分组成?</li><li>HTTP响应主要由哪几部分组成?</li><li>HTTP头部和数据如何组织在一起?</li><li>这是世界上第一个网页: http://info.cern.ch/hypertext/WWW/TheProject.html</li></ul><p>使用浏览器访问这个URL,并使用wireshark抓包,分析请求和响应。</p><p>请求:Method、URI、HTTP版本、Headers</p><p>响应:状态码、Headers、HTML内容</p><h3 id="作业-1" tabindex="-1"><a class="header-anchor" href="#作业-1" aria-hidden="true">#</a> 作业</h3><h4 id="http请求主要由哪几个部分组成" tabindex="-1"><a class="header-anchor" href="#http请求主要由哪几个部分组成" aria-hidden="true">#</a> HTTP请求主要由哪几个部分组成?</h4><p><strong>请求报文</strong></p><ol><li><p><strong>请求行</strong>:请求方法字段、URL字段和HTTP协议版本</p><p>例如:GET /index.html HTTP/1.1</p><p>get方法将数据拼接在url后面,传递参数受限</p><p>请求方法:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT</p></li><li><p><strong>请求头</strong>(key value形式)</p><ul><li><p>User-Agent:产生请求的浏览器类型。</p></li><li><p>Accept:客户端可识别的内容类型列表。</p></li><li><p>Host:主机地址</p></li></ul></li><li><p><strong>请求数据</strong></p><p>post方法中,会把数据以key value形式发送请求</p></li><li><p><strong>空行</strong></p><p>发送回车符和换行符,通知服务器以下不再有请求头</p></li></ol><h4 id="http响应主要由哪几部分组成" tabindex="-1"><a class="header-anchor" href="#http响应主要由哪几部分组成" aria-hidden="true">#</a> HTTP响应主要由哪几部分组成?</h4><p><strong>响应报文</strong></p><ol><li><p><strong>状态行</strong></p></li><li><p><strong>消息报头</strong></p></li></ol><p><strong>3. 响应正文</strong></p><h4 id="http头部和数据如何组织在一起" tabindex="-1"><a class="header-anchor" href="#http头部和数据如何组织在一起" aria-hidden="true">#</a> HTTP头部和数据如何组织在一起?</h4><p><img src="/assets/img/day2-HTTP-request-message.ac379a72.png" alt="HTTP请求报文"></p><h4 id="wireshark抓包" tabindex="-1"><a class="header-anchor" href="#wireshark抓包" aria-hidden="true">#</a> Wireshark抓包</h4><p>首先打开Wireshark,访问:http://info.cern.ch/hypertext/WWW/TheProject.html</p><p><img src="/assets/img/day2-World-Wide-Web-shortcut.ae1b396c.png" alt=""></p><p>使用Wireshark抓包(按照 <code>ip.src == 188.184.21.108</code> 过滤,先 <code>Ctrl+R</code> 清除记录一次)</p><p><img src="/assets/img/day2-wireshark.bc4bb754.png" alt="day2-wireshark"></p><p>按 <code>Ctrl+Alt+Shift+T</code> 追踪TCP流(右键 追踪流、TCP流)</p><p><img src="/assets/img/day2-trace-tcp-stream.69b2b430.png" alt="day2-trace-tcp-stream"></p><div class="language-text ext-text line-numbers-mode"><pre class="language-text"><code>GET /hypertext/WWW/TheProject.html HTTP/1.1
|
||
Host: info.cern.ch
|
||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
|
||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
|
||
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
|
||
Accept-Encoding: gzip, deflate
|
||
Connection: keep-alive
|
||
Upgrade-Insecure-Requests: 1
|
||
Pragma: no-cache
|
||
Cache-Control: no-cache
|
||
|
||
HTTP/1.1 200 OK
|
||
Date: Mon, 29 Nov 2021 12:28:56 GMT
|
||
Server: Apache
|
||
Last-Modified: Thu, 03 Dec 1992 08:37:20 GMT
|
||
ETag: "8a9-291e721905000"
|
||
Accept-Ranges: bytes
|
||
Content-Length: 2217
|
||
Connection: close
|
||
Content-Type: text/html
|
||
|
||
<HEADER>
|
||
<TITLE>The World Wide Web project</TITLE>
|
||
<NEXTID N="55">
|
||
</HEADER>
|
||
<BODY>
|
||
<H1>World Wide Web</H1>The WorldWideWeb (W3) is a wide-area<A
|
||
NAME=0 HREF="WhatIs.html">
|
||
hypermedia</A> information retrieval
|
||
initiative aiming to give universal
|
||
access to a large universe of documents.<P>
|
||
Everything there is online about
|
||
W3 is linked directly or indirectly
|
||
to this document, including an <A
|
||
NAME=24 HREF="Summary.html">executive
|
||
summary</A> of the project, <A
|
||
NAME=29 HREF="Administration/Mailing/Overview.html">Mailing lists</A>
|
||
, <A
|
||
NAME=30 HREF="Policy.html">Policy</A> , November's <A
|
||
NAME=34 HREF="News/9211.html">W3 news</A> ,
|
||
<A
|
||
NAME=41 HREF="FAQ/List.html">Frequently Asked Questions</A> .
|
||
<DL>
|
||
<DT><A
|
||
NAME=44 HREF="../DataSources/Top.html">What's out there?</A>
|
||
<DD> Pointers to the
|
||
world's online information,<A
|
||
NAME=45 HREF="../DataSources/bySubject/Overview.html"> subjects</A>
|
||
, <A
|
||
NAME=z54 HREF="../DataSources/WWW/Servers.html">W3 servers</A>, etc.
|
||
<DT><A
|
||
NAME=46 HREF="Help.html">Help</A>
|
||
<DD> on the browser you are using
|
||
<DT><A
|
||
NAME=13 HREF="Status.html">Software Products</A>
|
||
<DD> A list of W3 project
|
||
components and their current state.
|
||
(e.g. <A
|
||
NAME=27 HREF="LineMode/Browser.html">Line Mode</A> ,X11 <A
|
||
NAME=35 HREF="Status.html#35">Viola</A> , <A
|
||
NAME=26 HREF="NeXT/WorldWideWeb.html">NeXTStep</A>
|
||
, <A
|
||
NAME=25 HREF="Daemon/Overview.html">Servers</A> , <A
|
||
NAME=51 HREF="Tools/Overview.html">Tools</A> ,<A
|
||
NAME=53 HREF="MailRobot/Overview.html"> Mail robot</A> ,<A
|
||
NAME=52 HREF="Status.html#57">
|
||
Library</A> )
|
||
<DT><A
|
||
NAME=47 HREF="Technical.html">Technical</A>
|
||
<DD> Details of protocols, formats,
|
||
program internals etc
|
||
<DT><A
|
||
NAME=40 HREF="Bibliography.html">Bibliography</A>
|
||
<DD> Paper documentation
|
||
on W3 and references.
|
||
<DT><A
|
||
NAME=14 HREF="People.html">People</A>
|
||
<DD> A list of some people involved
|
||
in the project.
|
||
<DT><A
|
||
NAME=15 HREF="History.html">History</A>
|
||
<DD> A summary of the history
|
||
of the project.
|
||
<DT><A
|
||
NAME=37 HREF="Helping.html">How can I help</A> ?
|
||
<DD> If you would like
|
||
to support the web..
|
||
<DT><A
|
||
NAME=48 HREF="../README.html">Getting code</A>
|
||
<DD> Getting the code by<A
|
||
NAME=49 HREF="LineMode/Defaults/Distribution.html">
|
||
anonymous FTP</A> , etc.</A>
|
||
</DL>
|
||
</BODY>
|
||
</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br></div></div><p><strong>请求</strong>:</p><p>Method:GET</p><p>URI:/hypertext/WWW/TheProject.html</p><p>HTTP版本:HTTP/1.1</p><p>Headers:</p><p>Host: info.cern.ch User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,<em>/</em>;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache</p><p><strong>响应</strong>:</p><p>状态码:HTTP/1.1 200 OK</p><p>Headers:</p><p>Date: Mon, 29 Nov 2021 12:28:56 GMT Server: Apache Last-Modified: Thu, 03 Dec 1992 08:37:20 GMT ETag: "8a9-291e721905000" Accept-Ranges: bytes Content-Length: 2217 Connection: close Content-Type: text/html</p><p>HTML内容:</p><p>略</p><h2 id="第3天" tabindex="-1"><a class="header-anchor" href="#第3天" aria-hidden="true">#</a> 第3天</h2><h3 id="任务-套接字编程基础知识" tabindex="-1"><a class="header-anchor" href="#任务-套接字编程基础知识" aria-hidden="true">#</a> 任务:套接字编程基础知识</h3><p>学习资料: 《网络编程》第六章(见附件)</p><p>https://www.jianshu.com/p/6ca1c102fc00</p><p>https://wenku.baidu.com/view/8d0f749881c758f5f71f6749.html</p><p>作业:写一篇小短文,发布在星球,回答几个问题</p><ul><li>什么是套接字?</li><li>套接字有哪几个类型?</li><li>用套接字编写一个客户端和服务端,分别有哪几个步骤?</li></ul><p>附件:<a href="/web-server/files/day3-Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B.pdf">Linux网络编程.pdf</a></p><h3 id="作业-2" tabindex="-1"><a class="header-anchor" href="#作业-2" aria-hidden="true">#</a> 作业</h3><h4 id="什么是套接字" tabindex="-1"><a class="header-anchor" href="#什么是套接字" aria-hidden="true">#</a> 什么是套接字?</h4><p>套接字(socket)为通信的端点,每个套接字由一个 IP 地址和一个端口号组成。通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个。</p><h4 id="套接字有哪几个类型" tabindex="-1"><a class="header-anchor" href="#套接字有哪几个类型" aria-hidden="true">#</a> 套接字有哪几个类型?</h4><p>套接字的类型</p><p>常用的TCP/IP协议的3种套接字类型如下所示。</p><p>流套接字(SOCK_STREAM):</p><p>流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。</p><p>数据包套接字(SOCK_DGRAM):</p><p>数据包套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据包套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。</p><p>原始套接字(SOCK_RAW):</p><p>原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW</p><p>原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据包套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。</p><h4 id="用套接字编写一个客户端和服务端-分别有哪几个步骤" tabindex="-1"><a class="header-anchor" href="#用套接字编写一个客户端和服务端-分别有哪几个步骤" aria-hidden="true">#</a> 用套接字编写一个客户端和服务端,分别有哪几个步骤?</h4><p><strong>服务端</strong>:</p><ol><li>返回socket句柄</li><li>设置套接字</li><li>绑定端口,开始监听</li><li>等待客户端连接</li></ol><p><strong>客户端</strong>:</p><ol><li>创建连接</li><li>发送请求</li></ol><hr><p>下面是网上找到的:</p><p><strong>服务器</strong>:</p><ol><li><p>socketfd = socket(........); 返回一个socket文件句柄</p></li><li><p>设置套接字 setsockopt(socketfd , SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) // int on =1; SO_REUSEADDR表示可以重复使用一个端口</p></li><li><p>memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = ; (端口号) <em>/ addr.sin_addr.s_addr = htonl(INADDR_ANY); /</em> 可以监听本地的所有的ip */</p></li><li><p>bind(socketfd , (struct sockaddr*)&addr, sizeof(addr)) != 0 ) // 绑定端口和IP</p></li><li><p>listen(socketfd , 10) != 0 /* 启动监测数据,最多可以同时连接10个客服端 */</p></li><li><p>clientfd = accept(socketfd , (struct sockaddr <em>)&client_addr, &addr_len); /</em> 等待客服端的链接,如果有链接,则建立链接 返回一个客服端的clientfd 会堵塞*/</p></li></ol><p><strong>客户端</strong>:</p><ol><li><p>iSocketClient = socket(AF_INET, SOCK_DGRAM, 0); // SOCK_DGRAM 表示UDP</p></li><li><p>tSocketServerAddr.sin_family = AF_INET; tSocketServerAddr.sin_port = htons(端口号); /* host to net, short */ //tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;</p></li><li><p>iRet = connect(iSocketClient, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr)); // 连接</p></li></ol><p>参考:https://blog.csdn.net/lgz929974811/article/details/106006925</p><h2 id="★-第4天" tabindex="-1"><a class="header-anchor" href="#★-第4天" aria-hidden="true">#</a> ★ 第4天</h2><h3 id="任务-编写一个tcp-client-发出一个简单的http请求" tabindex="-1"><a class="header-anchor" href="#任务-编写一个tcp-client-发出一个简单的http请求" aria-hidden="true">#</a> 任务:编写一个TCP Client,发出一个简单的HTTP请求</h3><p>学习资料:</p><ul><li>C/C++ socket编程:《网络编程》(见附件)</li><li>Python socket编程:<a href="https://www.cnblogs.com/george92/p/9291394.html" target="_blank" rel="noopener noreferrer">https://www.cnblogs.com/george92/p/9291394.html<span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span></a></li><li>Java socket编程:<a href="https://m.runoob.com/java/java-networking.html" target="_blank" rel="noopener noreferrer">https://m.runoob.com/java/java-networking.html<span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span></a></li></ul><p>作业:</p><p>编写一个TCP Client程序,向http://www.baidu.com发起一个GET请求,并把服务器返回的数据打印出来</p><p>附件:<a href="/web-server/files/day3-Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B.pdf">Linux网络编程.pdf</a></p><h3 id="作业-3" tabindex="-1"><a class="header-anchor" href="#作业-3" aria-hidden="true">#</a> 作业</h3><p>面向连接的socket的工作流程👇</p><p><img src="/assets/img/day4-the-workflow-of-connection-oriented-sockets.81b480c8.png" alt="day4-the-workflow-of-connection-oriented-sockets"></p><p>无连接的socket工作流程👇</p><p><img src="/assets/img/day4-the-workflow-of-connection-oriented-sockets.81b480c8.png" alt="day4-the-workflow-of-connection-oriented-sockets"></p><h2 id="★-第5天" tabindex="-1"><a class="header-anchor" href="#★-第5天" aria-hidden="true">#</a> ★ 第5天</h2><h3 id="任务-编写一个tcp-server-发出一个简单的http响应" tabindex="-1"><a class="header-anchor" href="#任务-编写一个tcp-server-发出一个简单的http响应" aria-hidden="true">#</a> 任务:编写一个TCP Server,发出一个简单的HTTP响应</h3><p>学习资料:同昨天相同</p><p>作业:</p><p>编写一个TCP Server程序,当收到客户发来GET请求时(先不用管请求的具体是什么),都返回一个网页,网页的内容如下:</p><div class="language-html ext-html line-numbers-mode"><pre class="language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span>
|
||
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span>
|
||
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span>这是我的第一个网页!<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span>
|
||
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span>
|
||
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span>
|
||
</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>使用浏览器去访问自己写的这个TCP Server,截图展示访问效果</p><p>然后使用前一天自己编写的TCP Client去请求这个Server,通过Client将这个网页内容打印出来!</p><h3 id="作业-4" tabindex="-1"><a class="header-anchor" href="#作业-4" aria-hidden="true">#</a> 作业</h3><h2 id="★-第8天" tabindex="-1"><a class="header-anchor" href="#★-第8天" aria-hidden="true">#</a> ★ 第8天</h2><h3 id="任务-改造tcp-server-发送一个html文件" tabindex="-1"><a class="header-anchor" href="#任务-改造tcp-server-发送一个html文件" aria-hidden="true">#</a> 任务:改造TCP Server,发送一个HTML文件</h3><p>学习资料:同任务4 作业:今天的任务只有一个改动,就是将第五天任务中的TCP Server返回的那个网页内容,改为从文件中加载,而不是固定写死在代码中。</p><h2 id="★-第9天" tabindex="-1"><a class="header-anchor" href="#★-第9天" aria-hidden="true">#</a> ★ 第9天</h2><h3 id="任务-使用多线程" tabindex="-1"><a class="header-anchor" href="#任务-使用多线程" aria-hidden="true">#</a> 任务:使用多线程</h3><p>学习资料:同任务4 作业: 在原来TCP Server基础上进行改造:当服务器收到连接请求时,启动一个单独的线程进行处理。并且不要关闭连接,继续监听这个客户端后续的请求。</p><p>附件:<a href="/web-server/files/day3-Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B.pdf">Linux网络编程.pdf</a></p><h3 id="作业-5" tabindex="-1"><a class="header-anchor" href="#作业-5" aria-hidden="true">#</a> 作业</h3><h2 id="第10天" tabindex="-1"><a class="header-anchor" href="#第10天" aria-hidden="true">#</a> 第10天</h2><h3 id="任务-设计并使用配置文件" tabindex="-1"><a class="header-anchor" href="#任务-设计并使用配置文件" aria-hidden="true">#</a> 任务:设计并使用配置文件</h3><p>学习资料:无 作业: Web服务器一般会拥有多个参数,将服务器绑定的IP、端口、HTML文件所在的目录,写在配置文件中,程序启动的时候进行加载。</p><p>需要自己设计自己的Web服务器的文件格式,可以参考JSON、XML、YML等格式</p><h3 id="作业-6" tabindex="-1"><a class="header-anchor" href="#作业-6" aria-hidden="true">#</a> 作业</h3><iframe src="/web-server/files/day10-conf.json"></iframe><p><img src="/assets/img/day10-conf-image.07fa24a3.png" alt="day10-conf-image"></p><h3 id="作业-7" tabindex="-1"><a class="header-anchor" href="#作业-7" aria-hidden="true">#</a> 作业</h3><h3 id="作业-8" tabindex="-1"><a class="header-anchor" href="#作业-8" aria-hidden="true">#</a> 作业</h3><h3 id="作业-9" tabindex="-1"><a class="header-anchor" href="#作业-9" aria-hidden="true">#</a> 作业</h3><h3 id="作业-10" tabindex="-1"><a class="header-anchor" href="#作业-10" aria-hidden="true">#</a> 作业</h3><hr><p>11.29 11:01 其他人的作业</p><h1 id="笔记" tabindex="-1"><a class="header-anchor" href="#笔记" aria-hidden="true">#</a> 笔记</h1><h4 id="回答轩辕大佬的问题" tabindex="-1"><a class="header-anchor" href="#回答轩辕大佬的问题" aria-hidden="true">#</a> 回答轩辕大佬的问题:</h4><h5 id="_1-web服务器-约等于-http服务器-其他服务" tabindex="-1"><a class="header-anchor" href="#_1-web服务器-约等于-http服务器-其他服务" aria-hidden="true">#</a> 1.Web服务器 约等于 HTTP服务器 + 其他服务</h5><p>(先不去管它这些操作具体的名称,单纯记录他的操作,后面再补) 包含:拿到数据包之后解包的东西、解析客户端的意图的东西、进行分类处理,或是提供某种文件、或是处理数据的东西、将结果装入缓冲区的东西、将以HTTP协议格式打包的东西、将该数据包推入Internet的东西</p><h5 id="_2-主要流程是-接收数据-⇒-http解析-⇒-逻辑处理-⇒-http封包-⇒-发送数据" tabindex="-1"><a class="header-anchor" href="#_2-主要流程是-接收数据-⇒-http解析-⇒-逻辑处理-⇒-http封包-⇒-发送数据" aria-hidden="true">#</a> 2.主要流程是:接收数据 ⇒ HTTP解析 ⇒ 逻辑处理 ⇒ HTTP封包 ⇒ 发送数据</h5><h5 id="_3-用电脑画图画的-有点丑哈哈哈" tabindex="-1"><a class="header-anchor" href="#_3-用电脑画图画的-有点丑哈哈哈" aria-hidden="true">#</a> 3.用电脑画图画的,有点丑哈哈哈</h5><h4 id="其他" tabindex="-1"><a class="header-anchor" href="#其他" aria-hidden="true">#</a> 其他</h4><p>顺便熟悉一下Markdown语法哈哈哈 稍微浏览了一下计网的书,感觉轩辕大佬的模式很好,通过项目学习,补充细节 在公众号搜到几篇文章,感觉挺有意思的,特别是有画小人的那个图解的</p><h5 id="网址信息收集" tabindex="-1"><a class="header-anchor" href="#网址信息收集" aria-hidden="true">#</a> 网址信息收集</h5><p><strong><em>下面四个是一个系列的</em></strong> [# 自己动手开发一个 Web 服务器(一)](https://mp.weixin.qq.com/s/cTfLlJNpKhixk31zlvaFgg) [# 自己动手开发一个 Web 服务器(二)](https://mp.weixin.qq.com/s/2ulVC3L3w3YLcN4QS6lEvA) [# 自己动手开发一个 Web 服务器(三)《https://wx.zsxq.com/mweb/views/weread/search.html?keyword=A》](https://mp.weixin.qq.com/s/Yn_4XhwNSAuqNFGAilSmAA) [# 自己动手开发一个 Web 服务器(三)《https://wx.zsxq.com/mweb/views/weread/search.html?keyword=B》](https://mp.weixin.qq.com/s/B0CRXwKs8Z8FrW5tbEVHpg)</p><hr><p>[#Web服务器工作原理详解(基础篇)](https://mp.weixin.qq.com/s/eb7xOT0-2uE9caaEfAqSCg)(就是轩辕大佬发的) [# Linux下Web服务器详解](https://mp.weixin.qq.com/s/RZFQLpgjHj1V89BWyT8pQA) [# Linux | 搭建Web服务器](https://mp.weixin.qq.com/s/X6u3SBhZ7A54-uczToD9Kw) [# 来写一个属于自己的Web服务器](https://mp.weixin.qq.com/s/W5eDKKcHwlHtc-ssWOWBAg) [# 开发一个属于自己的 web 服务器](https://mp.weixin.qq.com/s/zX8JGTQ-GwC2q63UuIQKFw) [# 如何开发一个web静态服务器](https://mp.weixin.qq.com/s/H_t4jPSiBdogYVscoqUVaA) [# 开发一个 web 服务器](https://mp.weixin.qq.com/s/EoDV6g93TzKMGDV-R12jqA) [# web服务器开发之理论篇](https://mp.weixin.qq.com/s/ufQ68pdC7ZR3aI2gKZdsgw) [# 手写一个 web 服务器!](https://mp.weixin.qq.com/s/cKgoSqIk97M1M9Q-gBOLBw) [# Python 高手之路:从零开始打造一个Web服务器](https://mp.weixin.qq.com/s/3OWFXRTfhL30twQF4UzFUQ)</p><p>https://t.zsxq.com/YNZNRnm</p><!--]--></div><footer class="page-meta"><!----><div class="meta-item last-updated"><span class="meta-item-label">Last Updated: </span><span class="meta-item-info">2021/12/6 上午12:23:53</span></div><div class="meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: 2291200076@qq.com">Coding Zhang</span><!----><!--]--><!--]--></span></div></footer><!----><!--[--><!--]--></main><!--]--></div><!----><!--]--></div>
|
||
<script src="/assets/js/runtime~app.68eb4f6b.js" defer></script><script src="/assets/js/567.6fcf9384.js" defer></script><script src="/assets/js/app.b8559c28.js" defer></script>
|
||
</body>
|
||
</html>
|