HTTPServer升级版

HTTPServer升级版

1.httpserver

  1. 前台 前端 客户端 用户端
    功能:提供给用户直接使用
    要求:
    良好的用户体验
    更全面的交互功能
    很好的和后端进行数据交互
    有良好的跨平台性
    有一定的优化

  2. 后台 后端 服务端
    功能:逻辑处理、算法实现、 磁盘交互(数据库 静态文件处理)
    要求:
    健壮性,安全性
    并发性能和处理速度
    架构合理便于维护扩展

2.网站后端

httpserver + WebFrame

3.功能分析

  1. httpserver
    获取http请求
    解析http请求
    将请求发送给WebFrame
    从WebFrame接收反馈数据
    将数据组织为Rresponse格式发送给客户端

  2. WebFrame:
    从httpserver接收具体请求
    根据请求进行逻辑处理和数据处理
    *静态页面
    *逻辑数据
    将需要的数据反馈给httpserver

  3. 升级点:
    1. 采用httpserver和应用处理分离的模式
    2. 降低了耦合度
    3. 原则上httpserver可以搭配任意的WebFrame

4.项目结构:
项目流程

流程图
HTTPServer中
Httpserver.py

# coding=utf-8

'''
name: lisimeng
time: 2018-10-1

'''
from socket import *
import sys
import re
from threading import Thread  # 多线程
from setting import *  # 配置文件模块
import time


class HTTPServer(object):
    def __init__(self, addr=('0.0.0.0', 80)):  # 默认监听80端口
        self.sockfd = socket()
        self.sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        self.addr = addr
        self.bind(addr)

    def bind(self, addr):
        self.ip = addr[0]
        self.port = addr[1]
        self.sockfd.bind(addr)

    # HTTP服务器启动
    def server_forever(self):
        self.sockfd.listen(10)
        print('Listen the port %d...' % self.port)
        while True:
            connfd, addr = self.sockfd.accept()
            print('Connect from', addr)
            handle_client = Thread(target=self.handle_request, args=(connfd,))
            handle_client.setDaemon(True)
            handle_client.start()

    def handle_request(self, connfd):
        # 接收浏览器请求
        request = connfd.recv(4096)
        request_lines = request.splitlines()
        # 获取请求行
        request_line = request_lines[0].decode()

        # 正则表达式提取请求方法和内容
        pattern = r'(?P<METHOD>[A-Z]+)\s+(?P<PATH>/\S*)'
        try:
            env = re.match(pattern, request_line).groupdict()
        except:
            response_headlers = 'HTTP/1.1 500 Server Error'
            response_headlers += '\r\n'
            response_body = 'Server Error'
            response = response_headlers + response_body
            connfd.send(response.encode())
            return
        else:
            print(env)
        # 将请求发送给frame得到返回结果数据
        status, response_body = self.send_request(env['METHOD'], env['PATH'])
        
        # 根据响应码组织响应头内容
        response_headlers = self.get_headlers(status)

        # 将结果组织为http response 发送给客户端
        response = response_headlers + response_body
        connfd.send(response.encode())
        connfd.close()

     # 和frame交互,发送request获取response
    def send_request(self, method, path):
        s = socket()
        s.connect(frame_addr)

        # 向webframe发送method 和 path
        s.send(method.encode())
        time.sleep(0.1)
        s.send(path.encode())

        status = s.recv(128).decode()
        response_body = s.recv(4096*10).decode()

        return status, response_body




    def get_headlers(self, status):
        if status == '200':
            response_headlers = 'HTTP/1.1 200 OK\r\n'
            response_headlers += '\r\n'
        elif status == '400':
            response_headlers = 'HTTP/1.1 400 Not Found\r\n'
            response_headlers += '\r\n'

        return response_headlers


if __name__ == "__main__":
    httpd = HTTPServer(ADDR)
    httpd.server_forever()

setting.py

#HTTP SERVER配置文件


#httpserver地址
HOST = '0.0.0.0'
PORT = 8000
ADDR = (HOST, PORT)


#WebFrame地址
frame_ip = '127.0.0.1'
frame_port = 8080
frame_addr = (frame_ip, frame_port)

WebFrame中
setting.py

# WebFrame设置

frame_ip = '127.0.0.1'
frame_port = 8080
frame_addr = (frame_ip, frame_port)

# 静态文件存储路径
STATIC_DIR = './static'

ursl.py

#所有可以被访问的URL列表

from views import *


urls = [
    ('/time', show_time),
    ('/hello', say_hello),
    ('/bye', say_bye)
]

views.py

from time import ctime


def show_time():
    return ctime()


def say_hello():
    return "Hello Python"


def say_bye():
    return "Good bye"

WebFrame.py

# coding=utf-8

from socket import *
from setting import *
import time
from ursl import * # 能处理的事务
from views import * #具体方法


class Application(object):
    def __init__(self):
        self.sockfd = socket()
        self.sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        self.sockfd.bind(frame_addr)

    def start(self):
        self.sockfd.listen(5)
        while True:
            connfd, addr = self.sockfd.accept()

            # 接收请求方法
            method = connfd.recv(128).decode()

            # 接收请求内容
            path = connfd.recv(128).decode()

            print(method, path)

            if method == 'GET':
                if path == '/' or path[-5:] == '.html':
                    status, response_body = self.get_html(path)

                else:
                    status, response_body = self.get_data(path)

                # 将结果给httpserver
                connfd.send(status.encode())
                time.sleep(0.1)
                connfd.send(response_body.encode())

            elif method == 'POST':
                pass

    def get_html(self, path):
        if path == '/':
            get_file = STATIC_DIR + '/shows.html'
        else:
            get_file = STATIC_DIR + path
   

        try:
            f = open(get_file)
        except IOError:
            response = ('404', '===Sorry not found the page===')
        else:
            response = ('200', f.read())
        finally:
            return response

    def get_data(self, path):
        for url, handler in urls:
            if path == url:
                response_body = handler()
                return '200',response_body
        return "400", "Sorry,not found the data"



if __name__ == "__main__":
    app = Application()
    app.start()  # 启动框架等待request

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值