愚公移山日记·24
学习进程
昨天下载了一个新的敲代码的软件Pychram,Pychram的功能很强大,功能多,能力强,也就意味着要多花些时间去熟悉软件,适应新软件的环境,但是昨天我在看一些对Pychram使用的教学视频,很多博主都说了意思差不多的一句话,就是学习这pychram并不是非得把软件弄的门清,把最主要的内容搞懂就可以了,类似我们所使用的office,功能巨多,但是我们常用的功能也就占到所有功能的百分之二十。所以当遇到问题之后,百度一下,就可以非常快的解决问题,我把几个非常常用的快捷键展示一下。
下面我将前天敲的代码进行封装,更加真实的去做一个框架。
import socket
from application import app
class WebServer(object):
""""WenServer-web服务器"""
# 定义初始化方法
def __init__(self):
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置套接字属性
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSERADDR, True)
# 绑定端口
tcp_server_socket.bind(('', 8080))
# 开启监,设置套接字由主动设置为被动
tcp_server_socket.listen(128)
self.tcp_server_socket = tcp_server_socket
# 定义启动服务器的方法
def start(self):
while True:
new_client_socket, ip_port = self.tcp_server_socket.accept()
self.request_handler(new_client_socket, ip_port)
# 定义响应服务器
def request_handler(self, new_client_socket, ip_port):
"""接受客户端请求并处理"""
# 接受客户端请求报文
request_data = new_client_socket.recv(1024)
# 判断客户端是否下线
if not request_data:
print('客户端[%s]已经下线~' % str(ip_port))
new_client_socket.close()
return
# 调用app模块的application方法处理请求
request_data = app.application(request_data, ip_port)
# 发送请求报文
new_client_socket.send(request_data)
# 关闭连接
new_client_socket.close()
def main():
ws = WebServer()
ws.start()
app模块的代码
def parse_request(request_data,ip_port):
# 根据客户端浏览器请求的资源路径,返回请求资源
# 把请求协议解码得到请求报文的字符串
request_text = request_data.decode()
# 得到请求行
# 查找第一个\r\n出现的位置
loc = request_text.find('\r\n')
# 截取字符串从头开始截取到第一个\r\出现的位置
request_line = request_text[:loc]
# print(request_line)
# 把请求行,按照空=空格拆分,得到表格
request_line_list = request_line.split(' ')
# print(request_line_list)
# 得到请求的资源路径
filte_path = request_line_list[1]
print('[%s]正在请求:%s' % (str(ip_port), filte_path))
# 设置默认首页
if filte_path == '/':
filte_path = ''
return filte_path
def application(request_data, ip_port):
file_path = parse_request(request_data,ip_port)
resource_path = current_dir + file_path
# 拼接响应的报文
# 相应行
response_line = 'HTTP/1.1 200 ok\r\n'
# 响应头
response_header = 'Server:Python20WS/2.1\r\n'
# 响应空行
response_blank = '\r\n'
# 响应主体
try:
with open(resource_path, 'rb') as file:
response_body = file.read()
except Exception as e:
response_line = 'HTTP/1.1 404 NOT Found\r\n'
response_body = 'Error (%s)' % str(e)
response_body = response_body.encode()
response_data = (response_line + response_header + response_blank + response_body)
return response_data