Web服务器的底层原理与实现

简介: Web服务器的底层原理与实现

import socket, threading, time
from Http.HttpResponse import HttpResponse
from WebFrame.WebFrame import handler_request

class HttpWebServer(object):

__run = True
def __init__(self, ip_address:str,listen_port: int):
    self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # Set socket reuse ->  True   default:False
    self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    self.server_socket.bind(
        (ip_address, listen_port)
    )
    self.server_socket.listen(128)
@staticmethod
def handler_http_request(new_socket: socket.socket):
    """
    :param new_socket:
    :return:
    """
    rec_data = new_socket.recv(4096)
    if len(rec_data) == 0:
        return
    content = rec_data.decode("utf-8")
    request_path = content.split(" ", maxsplit=2)[1]
    if request_path == '/':
        request_path = '/index.html'
    if request_path.endswith(".html"):
        """ ----------------  dynamic  request   ----------------"""
        http_response = handler_request(
            {"request_path": request_path}
        )
        new_socket.send(http_response)
    else:
        """ ----------------  static   request   --------------- """
        response_headers, response_body, response_length = None, None, 0
        response_status = ''
        try:
            with open("../static" + request_path, 'rb') as f:
                response_body = f.read()
                response_length: int = len(response_body)
                response_status = HttpResponse.RESPONSE_STATUS_OK
        except BaseException as e:
            with open('../static/html/404.html', 'rb') as f:
                response_body = f.read()
                response_length: int = len(response_body)
                response_status = HttpResponse.RESPONSE_STATUS_NOT_FOUND
        finally:
            local_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            response_headers = f'HTTP/1.1 {response_status}\r\nContent-Length:{response_length}\r\nDate:{local_time}\r\nServer: Pagche\r\n'
            response = response_headers.encode("utf-8") + "\r\n".encode("utf-8") + response_body
            new_socket.send(response)
    new_socket.close()

def start(self) -> None:
    print("Server Start Successful!")
    while self.__run:
        new_socket, address_info = self.server_socket.accept()
        print(f"[+] client {address_info[0]} send request")
        sub_thread = threading.Thread(target=HttpWebServer.handler_http_request, args=(new_socket,))
        sub_thread.setDaemon(True)
        sub_thread.start()

def stop(self) -> None:
    self.__run = False
    print("Server Stop Successful!")

if name == '__main__':

server=HttpWebServer('',8888)
server.start()
相关文章
|
1月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
46 3
|
2月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
45 1
|
2月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
53 3
|
2月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
35 1
|
3月前
|
安全 关系型数据库 Shell
Web安全-浅析CSV注入漏洞的原理及利用
Web安全-浅析CSV注入漏洞的原理及利用
172 3
|
2月前
|
存储 安全 前端开发
在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
219 0
|
3月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
在Python Web开发中,中间件位于请求处理的关键位置,提供强大的扩展能力。本文通过问答形式,探讨中间件的工作原理、应用场景及实践策略,并以Flask和Django为例展示具体实现。中间件可以在请求到达视图前或响应返回后执行代码,实现日志记录、权限验证等功能。Flask通过装饰器模拟中间件行为,而Django则提供官方中间件系统,允许在不同阶段扩展功能。合理制定中间件策略能显著提升应用的灵活性和可扩展性。
51 4
|
2月前
|
存储 网络协议 Unix
docker的底层原理一:客户端-服务器架构
本文详细解释了Docker的客户端-服务器架构,包括常驻后台的Docker守护进程、通过命令行接口发送请求的Docker客户端、以及它们之间通过Unix socket或网络接口进行的通信。
26 0
|
4月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
205 0
|
5天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与ECS的区别及选择指南
轻量应用服务器和云服务器ECS(Elastic Compute Service)是两款颇受欢迎的产品。本文将对这两者进行详细的对比,帮助用户更好地理解它们之间的区别,并根据自身需求做出明智的选择。
下一篇
DataWorks