python 简易web静态服务器-1
显示固定的界面
import socket
def handle_client(client_socket):
recv_data=client_socket.recv(1024).decode("utf-8")
request_header_lines=recv_data.splitlines()
for line in request_header_lines:
print(line)
response_headers="HTTP/1.1 200 OK\r\n"
response_headers+="Server:PythonWebServer1.0\r\n"
response_headers+="Content-Type: text/html;charset=utf-8\r\n"
response_headers+="\r\n"
response_body="hello world"
response=response_headers+response_body
client_socket.send(response.encode("utf-8"))
client_socket.close()
def main():
TCP_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置当前服务器先close 即服务器端4次握手后资源能立即释放,这样就保证了,下次运行程序时可以立即绑定端口
TCP_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
TCP_socket.bind(("",7788))
TCP_socket.listen(128)
while True:
client_socket =TCP_socket.accept()
client_addr=client_socket[1]
client_socket=client_socket[0]
handle_client(client_socket)
main()
运行结果
显示需要的页
import socket
import re
DOCUMENTS_ROOT="./html"
def handle_client(client_socket):
recv_data=client_socket.recv(1024).decode("utf-8",errors="ignore")
request_header_lines=recv_data.splitlines()
for line in request_header_lines:
print(line)
http_request=request_header_lines[0]
print(http_request+"\r\n")
get_file_name=re.match("[^/]+(/[^ ]*)",http_request).group(1)
print(get_file_name)
if get_file_name=="/":
get_file_name=DOCUMENTS_ROOT+"/index.html"
else:
get_file_name=DOCUMENTS_ROOT+get_file_name
print("file name is ===2>%s"%get_file_name)
response_headers=""
response_body=""
try:
f=open(get_file_name,"rb")
except IOError:
response_headers="HTTP/1.1 404 not found\r\n"
response_headers+="Server:PythonWebServer2.0"
response_headers+="\r\n"
response_body="=====sorry,file not found===="
else:
response_headers="HTTP/1.1 200 OK\r\n"
response_headers+="Server:PythonWebServer1.0\r\n"
response_headers+="Content-Type: text/html;charset=utf-8\r\n"
response_headers+="\r\n"
response_body=f.read()
f.close()
finally:
print(response_headers)
print(response_body)
print(type(response_headers))
print(type(response_body))
response=str(response_headers)+str(response_body)
print(response)
client_socket.send(response.encode("utf-8"))
client_socket.close()
def main():
TCP_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置当前服务器先close 即服务器端4次握手后资源能立即释放,这样就保证了,下次运行程序时可以立即绑定端口
TCP_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
TCP_socket.bind(("",7788))
TCP_socket.listen(128)
while True:
client_socket =TCP_socket.accept()
client_addr=client_socket[1]
client_socket=client_socket[0]
try:
handle_client(client_socket)
except Exception as e:
print(e)
main()
可以根据URL访问需要的文件
多进程
import socket
import re
import multiprocessing
SERVER_ADDR=(HOST,PORT)="",8888
DOCUMENTS_ROOT="html"
class HTTPServer(object):
"""docstring for HTTPServer"""
def __init__(self, server_address):
self.listen_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.listen_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.listen_socket.bind(server_address)
self.listen_socket.listen(128)
def server_forever(self):
while True:
client_socket=self.listen_socket.accept()
client_address=client_socket[1]
client_socket=client_socket[0]
print(client_socket)
new_process=multiprocessing.Process(target=self.handleRequest,args=(client_socket,))
new_process.start()
client_socket.close()
def handleRequest(self,client_socket):
recv_data=client_socket.recv(1024).decode('utf-8')
requestHeaderLines=recv_data.splitlines()
for line in requestHeaderLines:
print(line)
request_line=requestHeaderLines[0]
get_file_name=re.match("[^/]+(/[^ ]*)",request_line).group(1)
print("file_name is ===>%s"%get_file_name)
if get_file_name=="/":
get_file_name=DOCUMENTS_ROOT+"/123.txt"
else:
get_file_name=DOCUMENTS_ROOT+get_file_name
print("file_name is ===>%s"%get_file_name)
try:
f=open(get_file_name,"rb")
except Exception as e:
print("open fail")
response_header="HTTP/1.1 404 not found\r\n"
response_header+="Server:PythonWebServer 3.0\r\n"
response_header+="Content-Type: text/html;charset=utf-8\r\n"
response_header+="\r\n"
response_body="====sorry,file not found"
else:
response_header="HTTP/1.1 200 OK \r\n"
response_header+="Server: PythonWebServer 3.0\r\n"
response_header+="Content-Type: text/html;charset=utf-8\r\n"
response_header+="\r\n"
response_body=f.read()
f.close()
finally:
respose=str(response_header)+str(response_body)
print(response_header)
print(response_body)
print(respose)
print(type(response_header))
print(type(response_body))
print(type(respose))
client_socket.send(respose.encode("utf-8"))
client_socket.close()
def main():
httpd=HTTPServer(SERVER_ADDR)
print("Web Server: Serving HTTP on PORT %d.....\n"%PORT)
httpd.server_forever()
if __name__=="__main__":
main()
多线程
import socket
import re
import threading
ROOT='html'
SERVER_ADDRESS=(HOST,PORT)="",8888
class HTTOServer(object):
def __init__(self,server_address):
self.listen_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#允许立即使用上次绑定的Port
self.listen_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#绑定
self.listen_socket.bind(server_address)
#变为被动,并指定 队列的长度
self.listen_socket.listen(128)
print("初始化完成")
def server_forever(self):
#循环运行web服务器,等待客户端的链接并为客户端服务
print("启动服务")
while True:
client_socket=self.listen_socket.accept()
client_address=client_socket[1]
client_socket=client_socket[0]
print(client_address)
#创建一个单独的线程为一个客户端服务
new_thd=threading.Thread(target=self.handleRequest,args=(client_socket,))
new_thd.start()
#因为线程是同享一个嵌套字,所以主线程不能关闭
def handleRequest(self,client_socket):
#用一个新的的线程为客户端服务
recv_data=client_socket.recv(1024).decode("utf-8")
print(recv_data)
requstHeaderLines=recv_data.splitlines()
for line in requstHeaderLines:
print(line)
if requstHeaderLines:
requst_line=requstHeaderLines[0]
get_file_name=re.match("[^/]+(/[^ ]*)",requst_line).group(1)
print("file name is ====>%s"%get_file_name)
if get_file_name=="/":
get_file_name=ROOT+"/123.txt"
else:
get_file_name=ROOT+get_file_name
print("file name is ====>%s"%get_file_name)
try:
f=open(get_file_name,"rb")
except Exception as e:
response_header="HTTP/1.1 404 not found \r\n"
response_header+="Server:PythonWebServer 3.0\r\n"
response_header+="Content-Type: text/html;charset=utf-8\r\n"
response_header+="\r\n"
response_body="===sorry,file not found ===="
else:
response_header="HTTP/1.1 200 OK \r\n"
response_header+="Server:PythonWebServer 3.0\r\n"
response_header+="Content-Type: text/html;charset=utf-8\r\n"
response_header+="\r\n"
response_body=f.read()
f.close()
finally:
client_socket.send(response_header.encode("utf-8"))
client_socket.send(response_body)
client_socket.close()
def main():
httpserver=HTTOServer(SERVER_ADDRESS)
print("web Server : Serving HTTP on port %d"%PORT)
httpserver.server_forever()
if __name__=="__main__":
main()
服务器Gevent (协程)
import socket
import re
import threading
ROOT='html'
SERVER_ADDRESS=(HOST,PORT)="",8888
class HTTOServer(object):
def __init__(self,server_address):
self.listen_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#允许立即使用上次绑定的Port
self.listen_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#绑定
self.listen_socket.bind(server_address)
#变为被动,并指定 队列的长度
self.listen_socket.listen(128)
print("初始化完成")
def server_forever(self):
#循环运行web服务器,等待客户端的链接并为客户端服务
print("启动服务")
while True:
client_socket=self.listen_socket.accept()
client_address=client_socket[1]
client_socket=client_socket[0]
print(client_address)
#创建一个单独的线程为一个客户端服务
new_thd=threading.Thread(target=self.handleRequest,args=(client_socket,))
new_thd.start()
#因为线程是同享一个嵌套字,所以主线程不能关闭
def handleRequest(self,client_socket):
#用一个新的的线程为客户端服务
recv_data=client_socket.recv(1024).decode("utf-8")
print(recv_data)
requstHeaderLines=recv_data.splitlines()
for line in requstHeaderLines:
print(line)
if requstHeaderLines:
requst_line=requstHeaderLines[0]
get_file_name=re.match("[^/]+(/[^ ]*)",requst_line).group(1)
print("file name is ====>%s"%get_file_name)
if get_file_name=="/":
get_file_name=ROOT+"/123.txt"
else:
get_file_name=ROOT+get_file_name
print("file name is ====>%s"%get_file_name)
try:
f=open(get_file_name,"rb")
except Exception as e:
response_header="HTTP/1.1 404 not found \r\n"
response_header+="Server:PythonWebServer 3.0\r\n"
response_header+="Content-Type: text/html;charset=utf-8\r\n"
response_header+="\r\n"
response_body="===sorry,file not found ===="
else:
response_header="HTTP/1.1 200 OK \r\n"
response_header+="Server:PythonWebServer 3.0\r\n"
response_header+="Content-Type: text/html;charset=utf-8\r\n"
response_header+="\r\n"
response_body=f.read()
f.close()
finally:
client_socket.send(response_header.encode("utf-8"))
client_socket.send(response_body)
client_socket.close()
def main():
httpserver=HTTOServer(SERVER_ADDRESS)
print("web Server : Serving HTTP on port %d"%PORT)
httpserver.server_forever()
if __name__=="__main__":
main()