import sys
from http.server import HTTPServer,SimpleHTTPRequestHandler
ServerClass = HTTPServer
HandlerClass = SimpleHTTPRequestHandler
if__name__ =='__main__':
port = int(sys.argv[2])
server_address = (sys.argv[1],port)
httpd = ServerClass(server_address,HandlerClass)
sa=httpd.socket.getsockname()
print("Serving HTTP on",sa[0],"port",sa[1],"...")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nKeyboard interrupt received, exiting.")
httpd.server_close()
sys.exit(0)
python3 myhttp.py 127.0.0.1 9999
+------------------+ +------------+| tcpserver基类 | | BaseServer +-------->| 开启事件循环监听 | +-----+------+ | 处理客户端请求 | | +------------------+ v +-----------------+ +------------+| httpserver基类 | | TCPServer +-------->+设置监听socket | +-----+------+ | 开启监听 | | +-----------------+ v +------------+ | HTTPServer | +------------+
defserve_forever(self, poll_interval=0.5): self.__is_shut_down.clear() try: with_ServerSelector()asselector: selector.register(self, selectors.EVENT_READ) whilenotself.__shutdown_request: ready = selector.select(poll_interval) ifready: self._handle_request_noblock() self.service_actions() finally: self.__shutdown_request = False self.__is_shut_down.set()
def_handle_request_noblock(self): try: request, client_address = self.get_request() exceptOSError: return ifself.verify_request(request, client_address): try: self.process_request(request, client_address) except: self.handle_error(request, client_address) self.shutdown_request(request) else: self.shutdown_request(request)
defprocess_request(self, request, client_address): self.finish_request(request, client_address) self.shutdown_request(request) # ------------------------------------------------- deffinish_request(self, request, client_address): self.RequestHandlerClass(request, client_address, self) defshutdown_request(self, request): self.close_request(request)
BaseServer==> def__init__(self, server_address, RequestHandlerClass): """Constructor. May be extended, do not override.""" self.server_address = server_address self.RequestHandlerClass = RequestHandlerClass self.__is_shut_down = threading.Event() self.__shutdown_request = False #-------------------------------------------------------------------------------- TCPServer==> def__init__(self, server_address, RequestHandlerClass, bind_and_activate=True): BaseServer.__init__(self, server_address, RequestHandlerClass) self.socket = socket.socket(self.address_family, self.socket_type) ifbind_and_activate: try: self.server_bind() self.server_activate() except: self.server_close() raise
defserver_bind(self): ifself.allow_reuse_address: self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.socket.bind(self.server_address) self.server_address = self.socket.getsockname() defserver_activate(self): self.socket.listen(self.request_queue_size)
defget_request(self): returnself.socket.accept()
classBaseRequestHandler: def__init__(self, request, client_address, server): self.request = request self.client_address = client_address self.server = server self.setup() try: self.handle() finally: self.finish() defsetup(self): pass defhandle(self): pass deffinish(self): pass
classStreamRequestHandler(BaseRequestHandler):
timeout = None
disable_nagle_algorithm = False
defsetup(self):
self.connection = self.request
ifself.timeoutisnotNone:
self.connection.settimeout(self.timeout)
ifself.disable_nagle_algorithm:
self.connection.setsockopt(socket.IPPROTO_TCP,
socket.TCP_NODELAY, True)
self.rfile = self.connection.makefile('rb', self.rbufsize)
self.wfile = self.connection.makefile('wb', self.wbufsize)
deffinish(self):
ifnotself.wfile.closed:
try:
self.wfile.flush()
exceptsocket.error:
pass
self.wfile.close()
self.rfile.close()
defhandle(self): self.close_connection = True self.handle_one_request() whilenotself.close_connection: self.handle_one_request()
defhandle_one_request(self):
try:
self.raw_requestline =self.rfile.readline(65537)
iflen(self.raw_requestline) >65536:
self.requestline =''
self.request_version =''
self.command =''
self.send_error(HTTPStatus.REQUEST_URI_TOO_LONG)
return
ifnotself.raw_requestline:
self.close_connection = True
return
ifnotself.parse_request():
return
mname = 'do_'+self.command
ifnothasattr(self, mname):
self.send_error(
HTTPStatus.NOT_IMPLEMENTED,
"Unsupported method (%r)"%self.command)
return
method = getattr(self, mname)
method()
self.wfile.flush()
except socket.timeout as e:
self.log_error("Request timed out: %r", e)
self.close_connection = True
return
# SimpleHTTPRequestHandler # --------------------------------------------- defdo_GET(self): """Serve a GET request.""" f = self.send_head() iff: try: self.copyfile(f, self.wfile) finally: f.close()
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有