#-*- coding:utf-8 -*-
from socketserver import ThreadingTCPServer, BaseRequestHandler
import importlib
import traceback
import time
import logging
logging.basicConfig(level=logging.DEBUG,
filename="log/xxgl_%s.log" % (time.strftime("%Y%m%d", time.localtime())),
filemode='a',
format='%(asctime)s-%(filename)s[line:%(lineno)d]-%(levelname)s: %(message)s')
module_list = {}socket
class MyBaseRequestHandler(BaseRequestHandler):
def handle(self):
#循環監聽(讀取)來自客戶端的數據
while True:
try:
#一次讀取1024字節,並去除兩端的空白字符(包括空格,TAB,\r,\n)
data = self.request.recv(1024).strip()
data = data.decode()
if data == '':
breakdebug
#self.client_address是客戶端的鏈接(host, port)的元組
logging.info("receive from %r: [%r]" % (self.client_address, data))
ret = self.exec_sub(data, data)
self.request.sendall(ret.encode())
except:
#traceback.print_exc() #當客戶端主動斷開鏈接時,self.recv(1024)會拋出異常
breakcode
def findModule(self, procName):
try:
return module_list[procName]
except:
logging.debug("module_list[%s] not found" % (procName))
return Noneorm
#根據報文名稱調用對應的模塊,並傳遞參數,將執行結果返回給客戶端
def exec_sub(self, procName, params):
try:
proc = self.findModule(procName)
logging.debug(str(proc))
if proc == None:
proc = importlib.import_module(procName)
module_list[procName] = proc
logging.debug('import_module: ' + procName)
else:
importlib.reload(proc)
time.sleep(1) #不延時會從新加載失敗
logging.debug('reload: ' + procName)
result = proc.call_sub(params)
return result
except Exception as e:
logging.error(str(e))
return "error"server
if __name__ == "__main__":
host = "" #主機名,能夠是ip,像localhost的主機名,或""
port = 9999 #端口
addr = (host, port)
server = ThreadingTCPServer(addr, MyBaseRequestHandler)
server.serve_forever()ip