• 在线客服

  • 扫描二维码
    下载博学谷APP

  • 扫描二维码
    关注博学谷微信公众号

  • 意见反馈

原创 面向对象开发静态Web服务器代码怎么写?

发布时间:2021-12-24 10:07:32 浏览 3208 来源:博学谷 作者:小谷

    面向对象开发静态Web服务器代码怎么写?先创建服务器类,其次创建初始化服务器配置方法,然后创建接收客户端请求的方法,最后创建发送响应报文给客户端方法。

    面向对象开发静态Web服务器代码

    一、面向对象开发静态Web服务器学习目标是什么

    能够写出面向对象方式的多任务web服务器程序

    二、以面向对象的方式开发静态Web服务器实现步骤是什么?

    (1)把提供服务的Web服务器抽象成一个类(HTTPWebServer)

    (2)提供Web服务器的初始化方法,在初始化方法里面创建socket对象

    (3)提供一个开启Web服务器的方法,让Web服务器处理客户端请求操作。

    三、静态Web服务器-面向对象开发的示例代码

    import socket
    import threading
    
    
    # 定义web服务器类
    class HttpWebServer(object):
        def __init__(self):
            # 创建tcp服务端套接字
            tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # 设置端口号复用, 程序退出端口立即释放
            tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
            # 绑定端口号
            tcp_server_socket.bind(("", 9000))
            # 设置监听
            tcp_server_socket.listen(128)
            # 保存创建成功的服务器套接字
            self.tcp_server_socket = tcp_server_socket
    
        # 处理客户端的请求
        @staticmethod
        def handle_client_request(new_socket):
            # 代码执行到此,说明连接建立成功
            recv_client_data = new_socket.recv(4096)
            if len(recv_client_data) == 0:
                print("关闭浏览器了")
                new_socket.close()
                return
    
            # 对二进制数据进行解码
            recv_client_content = recv_client_data.decode("utf-8")
            print(recv_client_content)
            # 根据指定字符串进行分割, 最大分割次数指定2
            request_list = recv_client_content.split(" ", maxsplit=2)
    
            # 获取请求资源路径
            request_path = request_list[1]
            print(request_path)
    
            # 判断请求的是否是根目录,如果条件成立,指定首页数据返回
            if request_path == "/":
                request_path = "/index.html"
    
            try:
                # 动态打开指定文件
                with open("static" + request_path, "rb") as file:
                    # 读取文件数据
                    file_data = file.read()
            except Exception as e:
                # 请求资源不存在,返回404数据
                # 响应行
                response_line = "HTTP/1.1 404 Not Found\r\n"
                # 响应头
                response_header = "Server: PWS1.0\r\n"
                with open("static/error.html", "rb") as file:
                    file_data = file.read()
                # 响应体
                response_body = file_data
    
                # 拼接响应报文
                response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
                # 发送数据
                new_socket.send(response_data)
            else:
                # 响应行
                response_line = "HTTP/1.1 200 OK\r\n"
                # 响应头
                response_header = "Server: PWS1.0\r\n"
    
                # 响应体
                response_body = file_data
    
                # 拼接响应报文
                response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
                # 发送数据
                new_socket.send(response_data)
            finally:
                # 关闭服务与客户端的套接字
                new_socket.close()
    
        # 启动web服务器进行工作
        def start(self):
            while True:
                # 等待接受客户端的连接请求
                new_socket, ip_port = self.tcp_server_socket.accept()
                # 当客户端和服务器建立连接程,创建子线程
                sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,))
                # 设置守护主线程
                sub_thread.setDaemon(True)
                # 启动子线程执行对应的任务
                sub_thread.start()
    
    
    # 程序入口函数
    def main():
        # 创建web服务器对象
        web_server = HttpWebServer()
        # 启动web服务器进行工作
        web_server.start()
    
    
    if __name__ == '__main__':
        main()

    四、面向对象开发静态Web服务器小结:

    (1)把提供服务的Web服务器抽象成一个类(HTTPWebServer)

     class HttpWebServer(object):

    (2)提供Web服务器的初始化方法,在初始化方法里面创建socket对象

     def __init__(self):
     # 初始化服务端套接字,设置监听,代码省略..

    (3)提供一个开启Web服务器的方法,让Web服务器处理客户端请求操作。

     def start(self):
     while True:
         service_client_socket, ip_port = self.tcp_server_socket.accept()
         # 连接建立成功,开辟子线程处理客户端的请求
         sub_thread = threading.Thread(target=self.handle_client_request, args=(service_client_socket,))
         sub_thread.start()

    申请免费试学名额    

在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!

上一篇: 多任务版静态Web服务器代码怎么写? 下一篇: 命令行启动动态绑定端口号静态Web服务器代码怎么写?

相关推荐 更多

热门文章

  • 前端是什么
  • 前端开发的工作职责
  • 前端开发需要会什么?先掌握这三大核心关键技术
  • 前端开发的工作方向有哪些?
  • 简历加分-4步写出HR想要的简历
  • 程序员如何突击面试?两大招带你拿下面试官
  • 程序员面试技巧
  • 架构师的厉害之处竟然是这……
  • 架构师书籍推荐
  • 懂了这些,才能成为架构师
  • 查看更多

扫描二维码,了解更多信息

博学谷二维码