- 一、TCP部分
- 1.TCP客户端开发
- 2.TCP服务端开发
- 二、HTTP部分
- 1.静态Web服务器的开发
- 2.静态Web服务器的面向对象开发
- 总结
一、TCP部分 1.TCP客户端开发
步骤如下:
- 创建客户端socket对象
- 连接服务器
- 发送与接收数据
- 关闭客户端
代码如下:
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服务端开发
步骤如下:
- 创建服务端socket对象
- 绑定端口号
- 设置监听数
- 等待客户端的连接请求
- 接收与发送数据
- 关闭服务端
代码如下:
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服务器的开发
步骤如下:
- 创建index.html文件,删除原有代码
- 自己在html文件里写代码或者将其他网页的源代码粘贴到index.html文件中
- 在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协议部分。
新手写文,如有错误还请在评论区指出,如有疑问也可在评论区提出,谢谢!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)