<div class="css-1yuhvjn"><div class="RichText ztext Post-RichText css-hnrfcf" options="[object Object]"><p data-pid="W9sIN8Sq">简单的说,web服务器就是机器上监听了本地的IP和端口的一个进程,当有客户的请求进来时,它会响应客户的请求并返回相应的信息。客户端和服务端之间的通信基于HTTP协议,客户端可以是浏览器或者任何支持HTTP的应用。我们平时访问网页或手机APP里接受服务端的数据,都是通过这样的方式。</p><p data-pid="19KqUW50">下面这张图是一个客户端和服务端交互的过程</p><figure data-size="normal"><noscript><img src="https://pic1.zhimg.com/v2-ce929336a997928f815c168cddb55488_b.jpg" data-caption="" data-size="normal" data-rawwidth="1024" data-rawheight="499" class="origin_image zh-lightbox-thumb" width="1024" data-original="https://pic1.zhimg.com/v2-ce929336a997928f815c168cddb55488_r.jpg"/></noscript><img src="https://pic1.zhimg.com/80/v2-ce929336a997928f815c168cddb55488_1440w.jpg" data-caption="" data-size="normal" data-rawwidth="1024" data-rawheight="499" class="origin_image zh-lightbox-thumb lazy" width="1024" data-original="https://pic1.zhimg.com/v2-ce929336a997928f815c168cddb55488_r.jpg" data-actualsrc="https://pic1.zhimg.com/v2-ce929336a997928f815c168cddb55488_b.jpg" data-lazy-status="ok"></figure><p data-pid="EQrjQAio">用户在浏览器输入网址向web服务器发出一个请求,web服务器收到请求后返回Hello, world!给浏览器,用户就能在浏览器上看到文字。</p><p class="ztext-empty-paragraph"><br></p><p data-pid="Pl8Ljkt6">我们来用Python实现这样一个简单的web服务器。代码如下</p><div class="highlight"><pre><code class="language-python"><span class="kn">import</span> <span class="nn">socket</span>
<span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span> <span class="o">=</span> <span class="s1">''</span><span class="p">,</span> <span class="mi">8888</span>
<span class="n">listen_socket</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="n">listen_socket</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">listen_socket</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span><span class="p">))</span>
<span class="n">listen_socket</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s1">'Serving HTTP on port </span><span class="si">%s</span><span class="s1"> ...'</span> <span class="o">%</span> <span class="n">PORT</span><span class="p">)</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
<span class="n">client_connection</span><span class="p">,</span> <span class="n">client_address</span> <span class="o">=</span> <span class="n">listen_socket</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
<span class="n">request</span> <span class="o">=</span> <span class="n">client_connection</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
<span class="n">http_response</span> <span class="o">=</span> <span class="s2">"""</span><span class="se">\
</span><span class="se"></span><span class="s2">HTTP/1.1 200 OK
</span><span class="s2">
</span><span class="s2">Hello, World!
</span><span class="s2">"""</span>
<span class="n">client_connection</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">http_response</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
<span class="n">client_connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></code></pre></div><p data-pid="oMZ8-nVw">上面的代码监听本地的8888端口,收到客户端的请求后,在控制台打印出请求的头部和内容,并返回响应的头部和内容给客户端。</p><p data-pid="BMIq4b0d">运行上面的代码</p><div class="highlight"><pre><code class="language-bash">root@ubuntu:~# python server.py
Serving HTTP on port <span class="m">8888</span> ...</code></pre></div><p data-pid="IOwkGqAL">打开浏览器,访问<a href="https://link.zhihu.com/?target=http%3A//localhost%3A8888/" class=" external" target="_blank" rel="nofollow noreferrer" data-za-detail-view-id="1043"><span class="invisible">http://</span><span class="visible">localhost:8888/</span><span class="invisible"></span></a>,会在浏览器看到如下的页面</p><figure data-size="normal"><noscript><img src="https://pic3.zhimg.com/v2-1603dd47feca115e87b1da99e4d9bf62_b.jpg" data-caption="" data-size="normal" data-rawwidth="262" data-rawheight="117" class="content_image" width="262"/></noscript><img src="https://pic3.zhimg.com/80/v2-1603dd47feca115e87b1da99e4d9bf62_1440w.jpg" data-caption="" data-size="normal" data-rawwidth="262" data-rawheight="117" class="content_image lazy" width="262" data-actualsrc="https://pic3.zhimg.com/v2-1603dd47feca115e87b1da99e4d9bf62_b.jpg" data-lazy-status="ok"></figure><p data-pid="HnhB0Pfl">同时在程序的控制台会有如下的输出</p><div class="highlight"><pre><code class="language-text">GET / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8</code></pre></div><p data-pid="J4t-FeGz">这就是客户端请求的头部信息。</p><p class="ztext-empty-paragraph"><br></p><p data-pid="WAMdE4Vo">HTTP协议是TCP协议上层的协议,因此在实现HTTP交互之前,客户端和服务端先要创建TCP连接。创建TCP连接就要用到socket模块。创建TCP连接由客户端发起,为接受客户端的TCP连接请求,服务器端需要经历以下几步:</p><ul><li data-pid="_2poMNug">创建socket</li><li data-pid="n6KFxgan">调用bind绑定到指定的IP和端口</li><li data-pid="cs3gw-Bl">调用listen监听端口</li><li data-pid="IIzBxtTi">调用accept接受客户端的请求</li></ul><p data-pid="LXZitvwH">至此一个TCP连接创建完成,接下来就可以进行数据的收发。</p><p class="ztext-empty-paragraph"><br></p><p data-pid="5I4hidy3">好了,以上就是一个最简单的web服务器。</p><p></p><p></p></div></div>
没有合适的资源?快使用搜索试试~ 我知道了~
Python 简单的Web服务器.zip
共1个文件
html:1个
需积分: 0 0 下载量 122 浏览量
2023-07-28
22:48:16
上传
评论
收藏 3KB ZIP 举报
温馨提示
Python 简单的Web服务器.zip
资源推荐
资源详情
资源评论
收起资源包目录
Python 简单的Web服务器.zip (1个子文件)
简单Web服务.html 7KB
共 1 条
- 1
资源评论
小嗷犬
- 粉丝: 2w+
- 资源: 1334
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功