import gevent # 在socket導入以前使用 from gevent import monkey monkey.patch_all() from socket import * from time import ctime def server(port): s = socket() s.bind(('0.0.0.0',port)) s.listen(5) while True: c,addr = s.accept() print("Connect from",addr) gevent.spawn(handler,c) #處理客戶端請求 def handler(c): while True: data = c.recv(1024).decode() if not data: break print("Receive:",data) c.send(ctime().encode()) c.close() if __name__ == "__main__": server(8888)
class CallTest(object): def __call__(self,a,b): print("This is call test") print("a =",a,"b =",b) test = CallTest() test(1,2)
#coding=utf-8 ''' module: HTTPServer.py name : Paris time : 2018-8-28 功能 :httpserver部分 modules: Python3.5 、socket、sys threading、re、setting ''' from socket import * import sys from threading import Thread import re from setting import * #處理http請求類 class HTTPServer(object): def __init__(self,application): self.sockfd = socket() self.sockfd.setsockopt\ (SOL_SOCKET,SO_REUSEADDR,1) #獲取模塊接口 self.application = application def bind(self,host,port): self.host = host self.port = port self.sockfd.bind((self.host,self.port)) #啓動服務器 def serve_forever(self): self.sockfd.listen(10) print("Listen the port %d..."%self.port) while True: connfd,addr = self.sockfd.accept() print("Connect from",addr) handle_client = Thread\ (target = self.client_handler,\ args = (connfd,)) handle_client.setDaemon(True) handle_client.start() def client_handler(self,connfd): #接收瀏覽器request request = connfd.recv(4096) #能夠分析請求頭和請求體 request_lines = request.splitlines() #獲取請求行 request_line = request_lines[0].decode('utf-8') #獲取請求方法和請求內容 pattern = r'(?P<METHOD>[A-Z]+)\s+(?P<PATH_INFO>/\S*)' try: env = re.match(pattern,request_line).groupdict() except: response_headlers = "HTTP/1.1 500 SERVER ERROR\r\n" response_headlers += "\r\n" response_body = "server error" response = response_headlers + response_body connfd.send(response.encode()) # method,filename = \ # re.findall(r'^([A-Z]+)\s+(/\S*)', request_line)[0] #將解析內容合成字典給web frame使用 # env = {'METHOD':method,'PATH_INFO':filename} # print(env) #將env給Frame處理,獲得返回內容 response = self.application(env) #發送給客戶端 if response: connfd.send(response.encode()) connfd.close() if __name__ == "__main__": #將要使用的模塊導入進來 sys.path.insert(1,MODULE_PATH) m = __import__(MODULE) application = getattr(m,APP) httpd = HTTPServer(application) httpd.bind(HOST,PORT) httpd.serve_forever()
# setting.py #httpserver配置文件 HOST = '0.0.0.0' PORT = 8000 #設置要使用的模塊和應用 MODULE_PATH = "." #設置Frame模塊路徑 MODULE = 'WebFrame' #設置模塊名稱 APP = 'app' #使用的應用
#coding=utf-8 from views import * ''' WebFrame.py WebFrame 框架 用於處理server解析請求 ''' #設置靜態文件夾路徑 STATIC_DIR = "./static" #應用 class Application(object): def __init__(self,urls): self.urls = urls def __call__(self,env): method = env.get("METHOD",'GET') path = env.get("PATH_INFO",'/') #請求內容 if method == 'GET': if path == '/' or path[-5:] == '.html': response = self.get_html(path) else: response = self.get_data(path) elif method == 'POST': pass return response def get_html(self,path): if path == '/': get_file = STATIC_DIR + "/index.html" else: get_file = STATIC_DIR + path try: fd = open(get_file) except IOError : #沒有找到請求網頁 responseHeaders = "HTTP/1.1 404 not found\r\n" responseHeaders += '\r\n' response_body = "Sorry,the page not found" else: responseHeaders = "HTTP/1.1 200 OK\r\n" responseHeaders += '\r\n' response_body = fd.read() finally: response = responseHeaders + response_body return response def get_data(self,path): for url,handler in self.urls: if path == url: response_headers = "HTTP/1.1 200 OK\r\n" response_headers += '\r\n' response_body = handler() return response_headers + response_body response_headers = "HTTP/1.1 404 not found\r\n" response_headers += '\r\n' response_body = "Sorry ,not found the data" return response_headers + response_body urls = [ ('/time',show_time), ('/hello',say_hello), ('/bye',say_bye), ] app = Application(urls)
# views.py # 具體處理模塊
import time def show_time(): return time.ctime() def say_hello(): return "hello world" def say_bye(): return "Good Bye"
try: from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer except ImportError: from http.server import BaseHTTPRequestHandler,HTTPServer class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): print(self.headers) #請求頭 print(self.path) #請求內容 fd = open('test.html','rb') content = fd.read() #組織response self.send_response(200) self.send_header('Content-Type','text/html') self.end_headers() self.wfile.write(content) def do_POST(self): pass address = ('0.0.0.0',8080) #生成httpserver對象 httpd = HTTPServer(address,RequestHandler) httpd.serve_forever() #啓動服務器