面向对象的服务器

import socket
import re
import multiprocessing


class WebServer(object):








    def service_client(self,new_socket):
        '''为这个客户端返回数据'''
        # 1.接受浏览器发过来的请求,即http请求
        # GET / HTTP/1.1
        #..
        request = new_socket.recv(1024).decode("utf-8")
# print(">>>"*50)
# print(request)


        request_lines = request.splitlines()
        print("")
        print(">"*20)
        print(request_lines)


        # GET /index.html HTTP/1.1
        # get post put del
        file_name = ""
        ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
        if ret:
            file_name = ret.group(1)
            # print("*"*50,file_name)
            if file_name == "/":
                file_name = "/index.html"
        # 2.返回http格式的数据,给浏览器
if file_name.endswith(".py"):
# py结尾,我们自己写代码返回
# 响应的格式
# 响应头,空行,想要提
header = "HTTP/1.1 200 OK\r\n"
body = "show content !"
content= header + "\r\n" + body
                                  
# 发送数据
new_socket.send(content.encode("utf-8"))


else:
# 按原先的代码方式返回,就是直接打开文件处理内容


try:
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "------file not found-----"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
# 2.1 准备发送给浏览器的数据---header
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n"
# 2.2 准备发送给浏览器的数据---boy
# response += "hahahhah"


# 将response header发送给浏览器
new_socket.send(response.encode("utf-8"))
# 将response body发送给浏览器
new_socket.send(html_content)


# 关闭套接
new_socket.close()


def run_server(self):
"""开启我们的服务"""
while True:
# 4. 等待新客户端的链接
new_socket, client_addr = self.tcp_server_socket.accept()


# 5. 为这个客户端服务
p = multiprocessing.Process(target=self.service_client, args=(new_socket,))
p.start()


new_socket.close()


# 关闭监听套接字
tcp_server_socket.close()


def __init__(self):
"""初始化套接字"""
# 1. 创建套接字
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2. 绑定
self.tcp_server_socket.bind(("", 8080)) # tomcat的默认端口,其他语言java
# 3. 变为监听套接字
self.tcp_server_socket.listen(128)




# 入口函数必须简洁,有点像目录
# 一个功能一个函数
# 入口函数,主函数
def main():
    '''完成对服务器的完整控制'''
    # 初始化套接字
    server = WebServer()


    server.run_server()


if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/weixin_42139375/article/details/80593057