近来,对http协议进行了研究,闲来无事。自己使用python3写了个静态Web服务器,以下是代码:

static_Web_sever.py
'''
思路:首先使用socket创建tcp服务器,照旧绑定,监听,接受,在recv和send之间对从客户端(浏览器)接受
到的数据进行分析(也就是请求报文),之后定义返回给浏览器的内容 '''
from socket import *
from multiprocessing import Process import re #常量必须全部大写
HTML_ROOT_DIR = './' def test(b_client):
'''服务器接受数据,处理数据,发送处理好的数据,处理客户端请求'''
request_data = b_client.recv(1024)
request_lines = request_data.splitlines()
for line in request_lines:
print(line)
#解析请求报文 ‘GET / HTTP/1/1'
request_start_line = request_lines[0]
#提取用户请求的文件,使用正则匹配
file_name = re.match(r"\w+ +(/[^ ]*) ",request_start_line.decode("utf-8")).group(1)
#防止主页为空,默认进入index.html
if "/" == file_name:
file_name = "/index.html"
try:
# 打开文件,读取内容
fp = open(HTML_ROOT_DIR+file_name,"rb")
except IOError:
response_start_line = 'HTTP/1.1 404 Not Found \r\n '
response_Headers = 'server: my server\r\n'
response_body = "404 Not found \nthe file is not found"
else:
file_date = fp.read()
fp.close()
# 构造响应数据
response_start_line = 'HTTP\\1.1 200 ok\r\n '
response_Headers = 'server: my server\r\n'
response_body = file_date.decode("utf-8") response = response_start_line + response_Headers + "\r\n" + response_body
b_client.send(response.encode("utf-8")) #以下是静态返回固定数据
'''
print("request data:%s"%request_data)
#构造响应数据
response_start_line = 'HTTP\\1.1 200 ok\r\n '
response_Headers = 'server: my server\r\n'
response_body = 'hello client 你好'
response = response_start_line + response_Headers + "\r\n" + response_body
print("response data:%s",response)
b_client.send(response.encode("gb2312"))
b_client.close()''' if __name__ == '__main__':
#创建套接字server_web
server_web = socket(AF_INET,SOCK_STREAM)
#绑定
server_web.bind(("",8000))
#设置端口重用
server_web.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
#监听
server_web.listen(128)
while 1:
# 接受数据
b_client,b_info = server_web.accept()
print("[%s, %s]:已连接"%b_info)
# print(b_info)
# 创建进程,并发处理
p = Process(target=test,args=(b_client,))
p.start()
b_client.close()

我们用到html文件,在py文件同级目录下新建html文件即可。

说一下遇到的问题:

1: 在创建套接字listen语句会报错,注意我们用的是TCP,不要使用UDP的关键字,不然在windows会报如下的错误:

    server_web.listen(128)
OSError: [WinError 10045] 参考的对象类型不支持尝试的操作。

2:在发送数据给浏览器的时候一定要注意编码问题,发送的报文主体一定要使用decode声明编码方式

3:对浏览器的请求数据使用splitlines()方法进行分割,得到我们能使用的数据

4:既然我们模仿服务器,就一样药逼真,一定要使用try except语句抓取异常并输出

demo截图:

静态Web服务器(py版)的更多相关文章

  1. 04-HTTP协议和静态Web服务器

    一.HTTP协议(HyperText Transfer Protocol)     超文本传输协议,超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片.音乐.视频.超链接等等都属于超文本. ...

  2. python网络-静态Web服务器案例(29)

    一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...

  3. Harp – 内置常用预处理器的静态 Web 服务器

    Harp 是一个基于 Node.js 平台的静态 Web 服务器,内置流行的预处理器,支持把 Jade, Markdown, EJS, Less, Stylus, Sass, and CoffeeSc ...

  4. 超简易静态Web服务器

    使用 HttpListener 写的一个超简易静态Web服务器 开发环境:VS2010 + .NET2.0 http://files.cnblogs.com/zjfree/EasyIIS.rar

  5. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  6. Python之HTTP静态Web服务器开发

    众所周知,Http协议是基于Tcp协议的基础上产生的浏览器到服务器的通信协议 ,其根本原理也是通过socket进行通信. 使用HTTP协议通信,需要注意其返回的响应报文格式不能有任何问题. 响应报文, ...

  7. 用HTTP核心模块配置一个静态Web服务器

    静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module.n ...

  8. node 创建静态web服务器(下)(处理异步获取数据的两种方式)

    接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...

  9. node 创建静态web服务器(上)

    声明:本文仅用来做学习记录. 本文将使用node创建一个简单的静态web服务器. 准备工作: 首先,准备好一个类似图片中这样的页面 第一步: 创建 http 服务: const http = requ ...

随机推荐

  1. 分布式系统ID的生成方法之UUID、数据库、算法、Redis、Leaf方案

    一般单机或者单数据库的项目可能规模比较小,适应的场景也比较有限,平台的访问量和业务量都较小,业务ID的生成方式比较原始但是够用,它并没有给这样的系统带来问题和瓶颈,所以这种情况下我们并没有对此给予太多 ...

  2. Linux 的ftp服务未启用怎么办

    1.检查是否安装ftp相关的rpm包(如出现下面提示证明是安装过相关rpm包的) [root@rac1 ~]# which vsftpd    /usr/sbin/vsftpd    [root@ra ...

  3. DOS命令行(7)——Windows网络检测与诊断

    ping ping 命令的作用是通过发送"网际控制报文协议(ICMP)"回响请求消息来验证另一台TCP/IP计算机的IP级连接状态,回响应答消息的接收情况将和返回过程的次数一起显示 ...

  4. [翻译]Go与C#对比 第三篇:编译、运行时、类型系统、模块和其它的一切

    Go vs C#, Part 3: Compiler, Runtime, Type System, Modules, and Everything Else | by Alex Yakunin | S ...

  5. R语言六种数据类型

    1 向量 1.1 定义向量 向量使用c来赋值,向量中不能混合不同类型的数据 x<-c(2,3,7,6,8)  数值型num y<-("one","two&qu ...

  6. JS里的异步实例化

    JS里的异步构造函数 众所周知,Js的构造函数是不能加上async/await来实现异步实例化的,一般当需要一个对象的属性是异步的结果时可以这样写: //! 一个需要指定时间后返回的异步函数 func ...

  7. 浅谈HttpDNS

    今天了解了腾讯云的HTTPDNS,这里使用腾讯的资料以及网上查阅的资料做个记录. 对互联网高度依赖的企业,不可避免的需要通过域名来提供互联网服务,而在复杂的互联网环境下,域名被缓存,被劫持导致的业务影 ...

  8. 14、CentOS7安装过程中,磁盘大于2T的报错处理

    问题描述 服务器磁盘单盘空间大于2TB,在安装CentOS7时出现下图报错: Boot failure.Reboot and Select proper Boot device... 问题原因: 安装 ...

  9. 34、mysql数据库(介绍)

    34.1.什么是数据库: 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织. 描述和存储,具有较小的冗余,较高的数据独立性和易扩 ...

  10. 别错过了,130+个微信小程序源码 “限时分享“

    ​里面有130+款微信小程序源码和效果图,我只放了其中几款小程序的截图,具体请看下方图片 ​ ​ ​ ​ ​ ​ ​ ​ 仿网易云音乐小程序源码 链接:https://pan.baidu.com/s/ ...