近来,对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截图:

最新文章

  1. 5. 网络配置与FTP服务笔记
  2. CVE-2016-4758: UXSS in Safari's showModalDialog
  3. sql连着function使用
  4. JavaWeb基础: 获取资源文件
  5. .NET(Core)应用程序模型及未来
  6. LIS HDOJ 1257 最少拦截系统
  7. cocopods的安装和使用
  8. 【转】让apache支持中文路径或者中文文件
  9. SaaS系列介绍之四:我国SaaS市场发展
  10. 帝国cms后台 不同栏目发布字段不同
  11. codeforces 887B Cubes for Masha 两种暴力
  12. IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 因为 Web server上此资源的訪问控制列表(ACL)配置或加密设置,您无权查看此文件夹或页面。)
  13. 洛谷 P2679 子串 解题报告
  14. poj1990两个树状数组
  15. sql2008升级到r2提示:检查当前是否正确配置了报表服务器、数据库服务器是否正在运行以及您是否有权访问
  16. python&django 常见问题及解决方法
  17. ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
  18. scala VS python2 操作shell对比例子
  19. python模块之importlib(py3中功能有明显加强)
  20. 加快mysql导入导出速度

热门文章

  1. 使用 flux2+kustomize+helm+github 进行多集群 GitOps 云原生渐进式交付
  2. 『无为则无心』Python基础 — 9、Python字符串的编码与转义
  3. 密码学系列之:twofish对称密钥分组算法
  4. 42、sort命令
  5. 9.4、安装zabbix(3)
  6. Linux从头学02:x86中内存【段寻址】方式的来龙去脉
  7. 删除有序数组中的重复项II
  8. AcWing 1127. 香甜的黄油
  9. js--你需要知道的字符串使用方法(含es6及之后)
  10. linux学习之路第八天(组管理和权限管理)