今天白天抽空学习了,没机会做笔记,晚上补上。
一、几点说明
显示连接用户- 当显示连接用户的时候,显示有多个用户连接上了,(1)是因为是浏览器的一种预加载行为。(2)当程序出现问题的时候,服务器不能响应正确数据,浏览器可能会发送多次请求
-
可能会出来一个请求时:favion,就是网页小图标
网页小图标 - 第一次请求时主页网址,主页的html只是一个框架,拿到了一系列信息,其中包含的文本只是图片的链接地址,而不是二进制图片;后面的图片都是后来发送请求再拿到的。
二、Ctrl+C 和 Ctrl+Z 的一些说明
Ctrl + C,会真正的kill一个进程
Ctrl + Z,只是暂时把程序调到后台进行运行(bg 显示, fg 调到前台)
Ctrl+C 和 Ctrl+Z
三、静态服务器面向对象编程抽象
为什么要有面向对象呢?
——封装:把我们的函数和它可能会用到一些变量绑定到一起,成为一个整体,提供一些特殊的方法供调用
抽象从成面向对象的思维:用到什么的时候再去封装什么
例如:跟服务器相关的属性和功能都可以封装到一起
——继承:为了把类中可以复用的代码最高效率利用(为了少写代码)
——多态:针对不同的实例,展现出不同的功能或属性(为了少写代码)
*先面向过程再面向对象
四、研究了最久的面向对象web案例
代码奉上:
# coding:utf-8
import socket
import re
# 定义一个常量用来接收客户端发起的文件请求地址
# 设置静态文件根目录
HTML_ROOT_DIR = "./html"
from multiprocessing import Process
class HTTPServer(object):
def __init__(self):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
def start(self):
self.server_socket.listen(128)
while True:
client_socket, client_address = self.server_socket.accept()
print("[%s, %s]用户连接上了" % client_address)
handle_client_process = Process(target=self.handle_client, args=(client_socket,))
handle_client_process.start()
client_socket.close()
def handle_client(self, client_socket):
# 获取客户端请求
request_data = client_socket.recv(1024)
print(request_data)
# 判断用户发来的请求
# 使用splitlines来切割不同行
request_lines = request_data.splitlines()
for line in request_lines:
print(line)
# GET / HTTP/1.1
request_start_line = request_lines[0]
file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode("utf-8")).group(1)
# 通常把常量写在“左边”,变量写在右边,防止少写一个“=”不报错
if "/" == file_name:
file_name = "/index.html"
# 打开文件,读取内容(客户有可能请求图片资源:加上b)
try:
file = open(HTML_ROOT_DIR + file_name, "rb")
except IOError:
response_start_line = "HTTP/1.1 404 NOT FOUND\r\n"
response_headers = "Sever: My Sever\r\n"
response_body = "The file is not found!"
else:
file_data = file.read()
file.close()
# 构造响应数据
response_start_line = "HTTP/1.1 200 OK\r\n"
response_headers = "Sever: My Sever\r\n"
response_body = file_data.decode("utf-8")
response = response_start_line + response_headers + "\r\n" + response_body
print("response data:", response)
# 向客户端形响应数据
client_socket.send(bytes(response, "utf-8"))
# 关闭客户端连接
client_socket.close()
def bind(self, port):
self.server_socket.bind(("", port))
def main():
http_server = HTTPServer()
# http_server.set_port()
http_server.bind(8080)
http_server.start()
if __name__ == "__main__":
main()
经过反复调试,成功,效果:
面向对象web案例
在此过程中学习了面向对象操作的一些常见坑:1、面向对象中新造的属性,前面不可少self. 2、请看第一条
*另外注意,服务器通常用“server”表示,不用“sever”,学好英语是多么重要
网友评论