静态Web服务器(py版)

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

 

 

 

posted @ 2019-04-11 16:29  二锅头不上头  阅读(186)  评论(0编辑  收藏  举报