HTTP协议、HTTP服务器、MiniWeb框架

协议、ip、端口

协议:通俗的说就是双方之间的约定


网络协议:就是计算机之间沟通数据的协议
常见的网络协议:UDP、TCP、IP、HTTP(s)、ARP、RARP、SMTP、FTP、TFTP

概念

  1. MAC地址:就是一个序列号标记了网卡的地址
  2. IP地址:一个序列号标记了逻辑上的一台电脑
  3. PORT端口:标记电脑上的软件
  4. 端口注意点:TCP、UDP是2套协议,一次都可以用同一个数值的端口(2425)

HTTP服务器

import re
import socket


class WSGIServer(object):

    def __init__(self, root):
        """初始化"""
        # html文件路径
        self.root = root
        """作为程序的主控制入口"""
        # 1.创建tcp的套接字
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置端口复用  当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定7788端口
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 2.绑定端口
        self.server_socket.bind(("", 7788))
        # 3.设置监听
        self.server_socket.listen(128)

    def run(self):
        """服务开始"""
        while True:
            # 获取客户端请求
            client_socket, client_addr = self.server_socket.accept()
            # 处理客户端请求
            self.handle_client(client_socket)

    def handle_client(self, client_socket):
        """处理客户端请求"""

        # 5. 接收浏览器的请求
        request = client_socket.recv(1024).decode('utf-8')
        # print(request)

        # 请求信息分行查看
        request_lines = request.splitlines()
        for i, line in enumerate(request_lines):
            print(i, line)

        # GET /index.html HTTP/1.1  正则匹配
        ret = re.match(r"([^/]*)([^ ]*)", request_lines[0])
        if ret:
            print("正则处理的数据:", ret.group(1))
            print("正则处理的数据:", ret.group(2))
            # 提取需要的文件名(包含路径)  这里是/index.html
            file_name = ret.group(2)
            # 不写index.html 也是主页
            if file_name == "/":
                file_name = "/index.html"

            # "./html/index.html"
            try:
                with open(self.root + file_name, "rb") as f:
                    # 读取文件内容
                    content = (200, f.read())  # 200 表示:http状态码
            except Exception as ret:
                content = (404, "404, 找不到您要的页面...")  # 404 表示:http状态码
        else:
            content = (500, "500, 系统异常...")  # 500 表示:http状态码

        # 组织相应 头信息(header)
        response_headers = "HTTP/1.1 %s OK\r\n" % content[0]  # 提取上述处理时的状态码
        response_headers += "Content-Type: text/html;charset=utf-8\r\n"
        response_headers += "\r\n"  # 用一个空的行与body进行隔开
        # 组织 内容(body)
        response_body = content[1].encode("utf-8")
        # 因为从文件读取出来的数据是二进制,而header是字符串,因此不能直接相加,需要分开发送
        # 先发送header
        client_socket.send(response_headers.encode("utf-8"))
        # 再发送文件的数据(body)
        client_socket.send(response_body)
        # 关闭客户端套接字
        client_socket.close()


def main():
    http_server = WSGIServer("./html")
    # 服务运行
    http_server.run()


if __name__ == "__main__":
    main()

Server与web framework的区别

Server:服务器


web framework:应用程序
区别:框架就相当于别人写好的功能,可以在此基础上实现想要的功能,就是别人给的相当于一部分已经实现的,我们再次基础上写模块:一般是一个独立的功能,拿过来直接用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值