学习目标
实现步骤:
import socket
# 创建socket 对象
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP和端口
server.bind(('127.0.0.1',8081))
# 指定监听数量
server.listen(5)
print('服务器启动。。。。。 http://127.0.0.1:8081')
while True:
# 等待连接
client_socket,addr=server.accept()
# 获取客户端数据
recv_data=client_socket.recv(1024)
# 将byte 转化为字符串
print('客户端数据:',recv_data.decode())
# 返回前端文件数据给客户端
# 读取文件
f = open('./index.html','r')
send_data=f.read()
# 构建响应报文数据
# 响应行
response_line = 'HTTP/1.1 200 OK\r\n'
# 响应头
response_header = "Server:python\r\n\r\n"
# 响应体
response_body = send_data
# 拼拉三部份数据构成完整的响应报文
response_data = response_line + response_header + response_body
client_socket.send(response_data.encode())
# 关闭
server.close()
学习目标
目前的Web服务器,不管用户访问什么页面,返回的都是固定页面的数据,接下来需要根据用户的请求返回指定页面的数据
返回指定页面数据的实现步骤:
import socket
# 创建服务端对象
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP端口
server.bind(('127.0.0.1',8008))
#监听
server.listen(5)
# 循环等待客户端连接
while True:
# 等待连接
client_data,addr=server.accept()
# 获取客户端数据
recv_data=client_data.recv(1024)
print(recv_data)
# 读取请求报文的请求路径,根据不同的请求路径返回不同的页面
# 1.将bytes类型转换
str_data=recv_data.decode()
# 2.字行串切割,按照\r\n进行切割,得到请求行,请求头数据,请求体数据
data_list=str_data.split('\r\n')
print('切割后的列表数据',data_list)
# 3. 从切割后的列表数据提到请求行数据,再次按照空格切割请求行数据
request_lines = data_list[0]
print('请求行数据',request_lines)
# 4. 从切割后的请求行列表数据中提取路径
url_path=request_lines.split(' ')[1]
print('请求路径',url_path)
# 5. 根据不同的请求路径不同的页面文件,返回浏览器
if url_path == '/':
# 请求道页
# 读取首页文件返回给浏览器
f = open('./index.html','r',encoding='utf-8')
send_data = f.read()
elif url_path == '/register':
# 注册页面
# 读取注册页面的数据
f = open('./register.html','r',encoding='utf-8')
send_data = f.read()
else:
send_data= '页面不存在'
# 返回数据给客户端
# 构建响应报文数据
# 响应行
response_line = 'HTTP/1.1 200 OK\r\n'
# 响应头
response_header = "Server:python\r\n\r\n"
# 响应体
response_body = send_data
response_data = response_line + response_header + response_body
client_data.send(response_data.encode())
server.close()
import socket
import threading
# 处理客户端请求
def client_request(client_data):
# 获取客户端数据
recv_data=client_data.recv(1024)
# if len(recv_data):
# client_data.send('not data')
# 读取请求报文的请求路径,根据不同的请求路径返回不同的页面
try:
# 1.将bytes类型转换
str_data=recv_data.decode()
# 2.字行串切割,按照\r\n进行切割,得到请求行,请求头数据,请求体数据
data_list=str_data.split('\r\n')
# 3. 从切割后的列表数据提到请求行数据,再次按照空格切割请求行数据
request_lines = data_list[0]
# 4. 从切割后的请求行列表数据中提取路径
url_path=request_lines.split(' ')[1]
except:
client_data.send('not data')
return None
# 5. 根据不同的请求路径不同的页面文件,返回浏览器
if url_path == '/':
# 请求道页
# 读取首页文件返回给浏览器
f = open('./index.html','r',encoding='utf-8')
send_data = f.read()
f.close()
elif url_path == '/register':
# 注册页面
# 读取注册页面的数据
f = open('./register.html','r',encoding='utf-8')
send_data = f.read()
f.close()
else:
send_data= '页面不存在'
# 返回数据给客户端
# 构建响应报文数据
# 响应行
response_line = 'HTTP/1.1 200 OK\r\n'
# 响应头
response_header = "Server:python\r\n\r\n"
# 响应体
response_body = send_data
response_data = response_line + response_header + response_body
client_data.send(response_data.encode())
# 创建服务端对象
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP端口
server.bind(('127.0.0.1',8009))
#监听
server.listen(5)
# 循环等待客户端连接
while True:
# 等待连接
client_data,addr=server.accept()
print('请求客户端的请求:',client_data)
# 创建线程,处理客户端请求
t= threading.Thread(target=client_request,args=(client_data,))
t.start()
server.close()
学习目标
实现步骤:
import socket
import threading
class WebServer(object):
def __init__(self):
# 创建服务端对象
self.server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP端口
self.server.bind(('127.0.0.1',8009))
#监听
self.server.listen(5)
def client_request(self,client_data):
# 获取客户端数据
recv_data=client_data.recv(1024)
# if len(recv_data):
# client_data.send('not data')
# 读取请求报文的请求路径,根据不同的请求路径返回不同的页面
try:
# 1.将bytes类型转换
str_data=recv_data.decode()
# 2.字行串切割,按照\r\n进行切割,得到请求行,请求头数据,请求体数据
data_list=str_data.split('\r\n')
# 3. 从切割后的列表数据提到请求行数据,再次按照空格切割请求行数据
request_lines = data_list[0]
# 4. 从切割后的请求行列表数据中提取路径
url_path=request_lines.split(' ')[1]
except:
client_data.send('not data')
return None
# 5. 根据不同的请求路径不同的页面文件,返回浏览器
if url_path == '/':
# 请求道页
# 读取首页文件返回给浏览器
f = open('./index.html','r',encoding='utf-8')
send_data = f.read()
f.close()
elif url_path == '/register':
# 注册页面
# 读取注册页面的数据
f = open('./register.html','r',encoding='utf-8')
send_data = f.read()
f.close()
else:
send_data= '页面不存在'
# 返回数据给客户端
# 构建响应报文数据
# 响应行
response_line = 'HTTP/1.1 200 OK\r\n'
# 响应头
response_header = "Server:python\r\n\r\n"
# 响应体
response_body = send_data
response_data = response_line + response_header + response_body
client_data.send(response_data.encode())
def start(self):
while True:
# 等待连接
client_data,addr=self.server.accept()
print('请求客户端的请求:',client_data)
# 创建线程,处理客户端请求
t= threading.Thread(target=self.client_request,args=(client_data,))
t.start()
def close(self):
self.server.close()
web = WebServer()
web.start()
t_data,addr=self.server.accept()
print(‘请求客户端的请求:’,client_data)
# 创建线程,处理客户端请求
t= threading.Thread(target=self.client_request,args=(client_data,))
t.start()
def close(self):
self.server.close()
web = WebServer()
web.start()