1. 使用python编写一个静态的web服务器,能够处理静态页面的http请求

原理:

a. 使用socket进行服务端和浏览器之间的通信

b. 使用多线程处理多个客户端浏览器的请求

c. 解析用户请求并使用http协议发送响应数据

实现:

# coding:UTF-8

import socket
import re

from multiprocessing import Process

def handle_request(client_socket):
    # 定义html服务器根目录
    HTML_ROOT_DIR = "./html"

    # 接收用户的请求
    request_data = client_socket.recv(1024)

    # 解析用户的请求
    request_lines = request_data.splitlines()
    request_first_line = request_lines[0].decode("UTF-8")
    # 使用正则表达式取出请求的文件名
    file_name = re.match(r"\w+ +(/[^ ]*) ", request_first_line).group(1)
    # 默认请求的文件名为index.html
    if "/" == file_name:
        file_name = "/index.html"
    file_path = HTML_ROOT_DIR + file_name

    # 读取请求资源的内容, 并构造响应报文
    try:
        file = open(file_path, "rb")
    except IOError:
        response_first_line = "HTTP/1.1 404 Not Found\r\n"
        response_headers = "Server: My Web Static Server\r\n"
        response_body = "file is not found"
        response = response_first_line + response_headers + "\r\n" + response_body
    else:
        data = file.read()
        file.close()
        response_first_line = "HTTP/1.1 200 OK\r\n"
        response_headers = "Server: My Web Static Server\r\n"
        response_body = data.decode("UTF-8")
        response = response_first_line + response_headers + "\r\n" + response_body

    # 发送响应报文
    client_socket.send(bytes(response, encoding="UTF-8"))

    # 关闭socket连接资源
    client_socket.close()

if __name__ == "__main__":
    '''这是主函数程序运行入口,如果该文件被当做模块导入则不执行'''
    # 创建一个服务端的socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置服务端socket重复利用端口地址
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 绑定服务端socket的端口
    server_socket.bind(("",8001))
    # 设置服务端socket最大同时响应128个客户端请求
    server_socket.listen(128)

    # 服务端永久等待客户端的请求, 来一个客户端请求则创建一个新的线程响应一个请求
    while True:
        client_socket, client_address = server_socket.accept()
        print('["%s", "%s"]用户已经连接上服务器!' % client_address)
        handler = Process(target=handle_request, args=(client_socket,))
        handler.start()
        client_socket.close()

  

老男孩python学习自修第二十一天【socket】的更多相关文章

  1. 老男孩 python学习自修第二十二天【文件上传与下载】

    1.使用socket实现文件上传 server.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import os import SocketServe ...

  2. 老男孩python学习自修第二十四天【多进程】

    1. 体验多进程的运行速度 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from multiprocessing import Pool import t ...

  3. 老男孩python学习自修第二十三天【多线程】

    1. 线程的创建与运行 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from threading import Thread def foo(param1 ...

  4. 老男孩python学习自修第十九天【异常处理】

    1.常见的错误 TypeError 类型错误 NameError 没有该变量 ValueError 不期望的值 AttributeError 没有该属性 UnboundLocalError 没有该局部 ...

  5. 老男孩python学习自修第十八天【面向对象】

    1.类与对象(构造方法与实例化) #!/usr/bin/env python # _*_ coding:UTF-8 _*_ class Province: def __init__(self, nam ...

  6. 老男孩python学习自修第十七天【装饰器】

    装饰器:在某个方法执行前后去执行其他新定义的行为 例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ def before_say_hello(): pr ...

  7. 老男孩python学习自修第十六天【常用模块之sys和os】

    例子: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys. ...

  8. 老男孩python学习自修第十五天【常用模块之time】

    例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import time if __name__ == "__main__": pr ...

  9. 老男孩python学习自修第十四天【序列化和json】

    序列化是使用二进制的方式加密列表,字典或集合,反序列化是解密的过程:序列化开启了两个独立进程进行数据交互的通路 使用pickle进行序列化和反序列化 例如: pickle_test.py #!/usr ...

随机推荐

  1. 【vue】vue +element 搭建项目,vuex中的store使用

    概述: 每一个 Vuex 应用的核心就是 store(仓库).“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state).Vuex 和单纯的全局对象有以下两点不同: Vuex 的 ...

  2. leetcode 74. Search a 2D Matrix 、240. Search a 2D Matrix II

    74. Search a 2D Matrix 整个二维数组是有序排列的,可以把这个想象成一个有序的一维数组,然后用二分找中间值就好了. 这个时候需要将全部的长度转换为相应的坐标,/col获得x坐标,% ...

  3. 输出1-100 , 奇数偶数分别添加标识(for循环语句嵌套if-else语句)

    package com.summer.cn; /** * @author Summer * 输出1-100 , 奇数偶数分别添加标识 */ public class Test041518 { publ ...

  4. 从零开始搭建django前后端分离项目 系列五(实战之excel流式导出)

    项目中有一处功能需求是:需要在历史数据查询页面进行查询字段的选择,然后由后台数据库动态生成对应的excel表格并下载到本地. 如果文件较小,解决办法是先将要传送的内容全生成在内存中,然后再一次性传入R ...

  5. WC 2018 题解

    WC 2018 题解 一些感受.jpg 题目难度相较前些年会相对简单一点?(FAKE.jpg 平均码量符合WC风格?(甚至更多一点 出题人良心! [WC2018] 通道 一个不知道对不对的$\log ...

  6. Java多线程编程核心技术(三)多线程通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  7. tkinter python(图形开发界面)

    Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macinto ...

  8. 朱晔和你聊Spring系列S1E5:Spring WebFlux小探

    阅读PDF版本 本文会来做一些应用对比Spring MVC和Spring WebFlux,观察线程模型的区别,然后做一下简单的压力测试. 创建一个传统的Spring MVC应用 先来创建一个新的web ...

  9. 剑指offer 第十一天

    46.扑克牌顺子 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的 ...

  10. 循环 while

    day 2 ---------------------------------------------------把一件简单的事情做到极致,你就成功了. Day2作业及默写 1.判断下列逻辑语句的Tr ...