Python 简单的HTTP服务器根据不同的请求地址返回不同的页面

1、创建TCP服务器端

import socket


def client_exec(client):
	'''处理用户的请求'''
	pass


def main():
    # 初始化套接字
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 綁定ip地址和端口(重用)
    tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_server.bind(('', 8080))

    # 设置被动模式
    tcp_server.listen(128)

    # 循环接收用户请求
    while True:
        client, address = tcp_server.accept()
        client_exec(client)
    # 关闭
    tcp_server.close()


if __name__ == '__main__':
    main()

2、处理用户的请求

    # 获取用户发送的数据
    recv_data = client.recv(1024).decode('utf-8')

    # 提取用户请求的地址
    match = re.match('[^/]+(/[^ ]*) ', recv_data)

    if match:
        # 说明有数据
        recv_path = match.group(1)
        if recv_path == '/':
            recv_path = '/index.html'
    else:
        # 说明没数据
        client.close()
        return

3、判断用户请求的地址,并根据不同的地址返回不同的网页结果

    # 响应行
    response_line = 'HTTP/1.1 200 OK\r\n'

    # 响应头
    response_head = 'Content-Type: text/html; charset=utf-8\r\n'

    # 判断请求地址
    if recv_path == '/index.html':
        response_body = '首页'
    elif recv_path == '/login.html':
        with open('./post.html', 'r') as f:
            response_body = f.read()
    elif recv_path == '/1.png':
        with open('./1.png', 'rb') as f:
            response_body = f.read()
    else:
        response_line = 'HTTP/1.1 400 NOT FOUND\r\n'
        response_body = '页面不存在'

    response_data = response_line + response_head + '\r\n' + response_body

    # 发送响应数据
    client.send(response_data.encode('utf-8'))

    # 关闭客户端
    client.close()

4、所有实现代码

import socket
import re


def client_exec(client):
    """根据不同的地址返回不同的页面"""
    # 获取用户发送的数据
    recv_data = client.recv(1024).decode('utf-8')

    # 提取用户请求的地址
    match = re.match('[^/]+(/[^ ]*) ', recv_data)

    if match:
        # 说明有数据
        recv_path = match.group(1)
        if recv_path == '/':
            recv_path = '/index.html'
    else:
        # 说明没数据
        client.close()
        return

    # 响应行
    response_line = 'HTTP/1.1 200 OK\r\n'

    # 响应头
    response_head = 'Content-Type: text/html; charset=utf-8\r\n'

    # 判断请求地址
    if recv_path == '/index.html':
        response_body = '首页'
    elif recv_path == '/login.html':
        with open('./post.html', 'r') as f:
            response_body = f.read()
    elif recv_path == '/1.png':
        with open('./1.png', 'rb') as f:
            response_body = f.read()
    else:
        response_line = 'HTTP/1.1 400 NOT FOUND\r\n'
        response_body = '页面不存在'

    response_data = response_line + response_head + '\r\n' + response_body

    # 发送响应数据
    client.send(response_data.encode('utf-8'))

    # 关闭客户端
    client.close()


def main():
    # 初始化套接字
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 綁定ip地址和端口(重用)
    tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_server.bind(('', 8080))

    # 设置被动模式
    tcp_server.listen(128)

    # 循环接收用户请求
    while True:
        client, address = tcp_server.accept()
        client_exec(client)
    # 关闭
    tcp_server.close()


if __name__ == '__main__':
    main()

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值