基于Python的面向对象开发静态Web服务器的学习

基于Python的面向对象开发静态Web服务器的学习,第1张

文章目录
  • 一、TCP部分
    • 1.TCP客户端开发
    • 2.TCP服务端开发
  • 二、HTTP部分
    • 1.静态Web服务器的开发
    • 2.静态Web服务器的面向对象开发
  • 总结


一、TCP部分 1.TCP客户端开发

步骤如下:

  1. 创建客户端socket对象
  2. 连接服务器
  3. 发送与接收数据
  4. 关闭客户端

代码如下:

import socket

#这里的两个参数依次代表了IPv4和TCP协议
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
#这里以元组传参,因此需要两对括号
client.connect(('127.0.0.1', 8000))

data = 'xxx'
#两种方式将字符串类型转换为bytes类型
client.send(data.encode())
client.send(b'{data}')

#__bufsize用于设置每次接收的字节数,可以只写数字
recv_data = client.recv(__bufsize=1024)
#decode()可以将bytes类型转换为字符串类型
str_data = recv_data.decode()

client.close()

2.TCP服务端开发

步骤如下:

  1. 创建服务端socket对象
  2. 绑定端口号
  3. 设置监听数
  4. 等待客户端的连接请求
  5. 接收与发送数据
  6. 关闭服务端

代码如下:

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8000))
server.listen(5)

#accept()返回两个值:数据和客户端IP
client_data, addr = server.accept()
data = 'xxx'
client_data.send(data.encode())
server.close()

多任务版TCP服务端开发
思路:将接收与返回的部分交给子线程,即可使主线程继续等待客户端请求

在1和2代码的基础上进行改进:

import threading, socket

#封装处理客户端数据的方法
def client_deal(client_data):
	while True:
		recv_data = client_data.recv(1024)
		data = '...'
		client_data.send(data.encode())

#将服务端接收与返回数据的部分交给子线程
t = threading.Thread(target=client_data, args=(client_data,))

PS:子线程报错不会影响主线程


二、HTTP部分 1.静态Web服务器的开发

步骤如下:

  1. 创建index.html文件,删除原有代码
  2. 自己在html文件里写代码或者将其他网页的源代码粘贴到index.html文件中
  3. 在TCP服务端的基础上构建符合HTTP协议的请求报文数据和响应报文数据

第三步详解:
基本服务部分基于TCP服务端开发部分,下面详解HTTP报文部分。

构建响应报文数据:

#返回前端文件数据给客户端
with open('index.html', 'r', encoding='gbk') as f:
	send_data = f.read()
#构建响应报文数据
response_line = 'HTTP/1.1 200 ok\r\n\r\n'
response_header = 'Server:python\r\n\r\n'
response_body = send_data
response_data = response_line + response_header + response_body

构建请求报文数据:

str_data = recv_data.decode('gbk')
data_list = recv_data.decode('gbk')
request_line = data_list[0]
url_path = request_line.split(' ')[1]

#用if-elif-else判断不同请求路径应当返回的不同页面
if url_path == '/':
	with open('index.html', 'r', encoding='gbk') as f:
		send_data = f.read()
elif ......:
	......
else:
	send_data = 'Not Found'

多任务部分:

while True:
    client_data, attr = self.server.accept()
    print('请求的客户端:', client_data)
    t = threading.Thread(target=self.client_request, args=(client_data,))
    t.start()

2.静态Web服务器的面向对象开发

我们可以将静态Web服务器封装为一个类,并将其封装到模块里,以方便我们使用。

import socket, threading

class WebServer:

    def __init__(self, addr='127.0.0.1', port=8000, listen_times=5):
    """添加服务器类的三个属性"""
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((addr, port))
        self.server.listen(listen_times)

    def start_server(self):
    """多线程启动服务器"""
        print('服务器启动……')
        while True:
            client_data, attr = self.server.accept()
            print('请求的客户端:', client_data)
            t = threading.Thread(target=self.client_request, args=(client_data,))
            t.start()

    def client_request(self, client_data):
    """处理客户端请求"""
        recv_data = client_data.recv(1024)
		#防止因读取空数据而出错
        try:
            str_data = recv_data.decode()
            data_list = recv_data.decode('gbk')
            print('切割后:', data_list)
            request_line = data_list[0]
            print('请求行:', request_line)
            url_path = request_line.split(' ')[1]
        except Exception as e:
            print(e)
            client_data.send(b'No Data')
            return None
        
        #根据不同请求路径读取不同页面文件数据返回浏览器(参照前文)
        
		#构建响应报文并返回(参照前文)

总结

本文简单介绍了基于Python的面向对象开发静态Web服务器的过程,是本人的一份学习笔记,主要包括TCP协议部分与HTTP协议部分。

新手写文,如有错误还请在评论区指出,如有疑问也可在评论区提出,谢谢!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/789450.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存