B/S架构:B浏览器/S服务器端初学(代码部分)

静态Web服务器之返回指定页面

import socket

if __name__ == '__main__':
    # 1、创建套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2、绑定端口
    tcp_server_socket.bind(('', 8080))
    # 3、设置监听
    tcp_server_socket.listen(128)
    while True:
        # 4、接收客户端连接请求
        conn_socket, ip_port = tcp_server_socket.accept()
        # 5、接收数据(HTTP请求报文)
        recv_client_data = conn_socket.recv(4096)
        if len(recv_client_data) > 0:
            recv_client_content = recv_client_data.decode('utf-8')
            # print(recv_client_content)
            # 获取用户请求的资源路径(资源格式 => GET  请求资源路径   HTTP/1.1)
            request_path = recv_client_content.split(' ', maxsplit=2)[1]
            # print(request_path)

            # 特殊情况:如果request_path == '/',则应该让其访问项目的首页!
            if request_path == '/':
                request_path = '/index.html'

            # 6、发送数据(HTTP响应报文)
            try:
                with open('static' + request_path, 'rb') as f:  # 'static' + request_path = static/hlw.png
                    file_data = f.read()
            except Exception as e:
                # 如果文件不存在,则返回HTTP/1.1 404 Not Found
                # ① 响应行
                response_line = 'HTTP/1.1 404 Not Found\r\n'
                # ② 响应头
                response_header = 'Server:PWB1.0\r\n'
                # ③ 响应体
                with open('static/error.html', 'rb') as f:
                    file_data = f.read()

                response_body = file_data
                # ④ 组装响应数据
                response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body
                conn_socket.send(response_data)
            else:
                # ① 响应行
                response_line = 'HTTP/1.1 200 OK\r\n'
                # ② 响应头
                response_header = 'Server:PWB1.0\r\n'
                # ③ 响应体
                response_body = file_data
                # ④ 组装响应数据
                response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body
                conn_socket.send(response_data)
            finally:
                # 7、关闭客户端与服务器端新产生套接字对象
                conn_socket.close()
复制代码

静态Web服务器之多任务版本

import socket
import threading

def handle_client_request(conn_socket):
    # 6、接收客户端发送过来的请求数据
    recv_client_data = conn_socket.recv(4096)
    if len(recv_client_data) > 0:
        # 把客户端的请求数据转码
        recv_client_content = recv_client_data.decode('utf-8')
        # print(recv_client_content)
        # 获取用户请求的资源地址
        request_path = recv_client_content.split(' ', maxsplit=2)[1]

        if request_path == '/':
            request_path = '/index.html'

        # 7、返回数据给客户端浏览器(HTTP响应报文)
        try:
            with open('static' + request_path, 'rb') as f:
                file_data = f.read()
        except Exception as e:
            # 返回404 Not Found
            # ① 响应行
            response_line = 'HTTP/1.1 404 Not Found\r\n'
            # ② 响应头
            response_header = 'Server:PWB1.0\r\n'
            # ③ 响应体
            with open('static/error.html', 'rb') as f:
                file_data = f.read()
            response_body = file_data
            # ④ 组装HTTP响应报文
            response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body

            conn_socket.send(response_data)
        else:
            # 返回200 OK
            # ① 响应行
            response_line = 'HTTP/1.1 200 OK\r\n'
            # ② 响应头
            response_header = 'Server:PWB1.0\r\n'
            # ③ 响应体
            response_body = file_data
            # ④ 组装HTTP响应报文
            response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body

            conn_socket.send(response_data)
        finally:
            conn_socket.close()


if __name__ == '__main__':
    # 1、创建套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 2、绑定端口
    tcp_server_socket.bind(('', 8080))
    # 3、设置监听
    tcp_server_socket.listen(128)
    while True:
        # 4、接收客户端连接请求
        conn_socket, ip_port = tcp_server_socket.accept()
        # 5、创建子线程
        sub_thread = threading.Thread(target=handle_client_request, args=(conn_socket,))
        # 设置守护主线程
        sub_thread.setDaemon(True)
        sub_thread.start()
复制代码

静态Web服务器之面向对象版本

import socket
import threading

class HttpWebServer(object):
    # 1、定义一个__init__()魔术方法,用于初始化socket套接字对象
    def __init__(self):
        # 2、创建套接字对象
        tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置端口复用
        tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        # 3、绑定端口
        tcp_server_socket.bind(('', 8080))
        # 4、设置监听
        tcp_server_socket.listen(128)
        # 5、把tcp_server_socket设置为对象属性
        self.tcp_server_socket = tcp_server_socket

    @staticmethod
    def handle_client_request(conn_socket):
        # 接收客户端发送过来数据
        recv_client_data = conn_socket.recv(4096)
        if len(recv_client_data) > 0:
            # 把客户端的请求数据转码
            recv_client_content = recv_client_data.decode('utf-8')
            # print(recv_client_content)
            # 获取用户请求的资源地址
            request_path = recv_client_content.split(' ', maxsplit=2)[1]

            if request_path == '/':
                request_path = '/index.html'

            # 返回数据给客户端浏览器(HTTP响应报文)
            try:
                with open('static' + request_path, 'rb') as f:
                    file_data = f.read()
            except Exception as e:
                # 返回404 Not Found
                # ① 响应行
                response_line = 'HTTP/1.1 404 Not Found\r\n'
                # ② 响应头
                response_header = 'Server:PWB1.0\r\n'
                # ③ 响应体
                with open('static/error.html', 'rb') as f:
                    file_data = f.read()
                response_body = file_data
                # ④ 组装HTTP响应报文
                response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body

                conn_socket.send(response_data)
            else:
                # 返回200 OK
                # ① 响应行
                response_line = 'HTTP/1.1 200 OK\r\n'
                # ② 响应头
                response_header = 'Server:PWB1.0\r\n'
                # ③ 响应体
                response_body = file_data
                # ④ 组装HTTP响应报文
                response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body

                conn_socket.send(response_data)
            finally:
                conn_socket.close()

    def start(self):
        while True:
            # 6、接收客户端连接请求
            conn_socket, ip_port = self.tcp_server_socket.accept()
            # 7、创建子线程
            sub_thread = threading.Thread(target=self.handle_client_request, args=(conn_socket, ))
            # 设置守护主线程
            sub_thread.setDaemon(True)
            # 8、启动子线程
            sub_thread.start()

if __name__ == '__main__':
    web_server = HttpWebServer()
    # 启动Web服务器
    web_server.start()
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享