1.Python实现简易版web服务器
import socket
import re
import threading
import multiprocessing
import gevent
import sys
from gevent import monkey
class HTTPServer(object):
def __init__(self, port):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(('', port))
self.server_socket.listen(128)
def client_handler(self, client_socket):
recv_data = client_socket.recv(4096)
recv_str_data = recv_data.decode()
data_set = recv_str_data.split("\r\n")
request_line = data_set[0]
print(request_line)
result = re.match(r'\w+\s+(\S+)', request_line)
if not result:
print("HTTP请求报文格式错误")
client_socket.close()
return
path_info = result.group(1)
print("接受到用户的资源请求 %s" % path_info)
if path_info == '/':
path_info = '/index.html'
try:
file = open("./static" + path_info, 'rb')
file_data = file.read()
file.close()
except Exception as e:
response_line = "HTTP/1.1 404 Not Found\r\n"
response_header = "Server: PythonWebServer 5.0\r\n"
response_body = "ERROR: file not found!!!"
response_data = response_line + response_header+"\r\n"+response_body
client_socket.send(response_data.encode())
else:
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server: PythonWebServer 5.0\r\n"
response_body = file_data
response_data = (response_line+response_header+"\r\n").encode() + response_body
client_socket.send(response_data)
finally:
client_socket.close()
def start_threading(self):
while True:
client_socket, client_addr = self.server_socket.accept()
print("接受到来自%s的链接请求" % str(client_addr))
thread = threading.Thread(target=self.client_handler, args=(client_socket,))
thread.start()
def start_processing(self):
while True:
client_socket, client_addr = self.server_socket.accept()
print("接受到来自%s的链接请求" % str(client_addr))
process = multiprocessing.Process(target=self.client_handler, args=(client_socket,))
process.start()
client_socket.close()
def start_gevent(self):
while True:
client_socket, client_addr = self.server_socket.accept()
print("接受到来自%s的链接请求" % str(client_addr))
gevent.spawn(self.client_handler, client_socket)
def main():
if len(sys.argv) < 2:
print("参数错误: 请使用类似于 python web.py 8888")
return
port = int(sys.argv[1])
http_server = HTTPServer(port)
http_server.start_threading()
if __name__ == "__main__":
main()