#-*- 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 = {}
class MyBaseRequestHandler(BaseRequestHandler):
def handle(self):
#循环监听(读取)来自客户端的数据
while True:
try:
#一次读取1024字节,并去除两端的空白字符(包括空格,TAB,
,
)
data = self.request.recv(1024).strip()
data = data.decode()
if data == '':
break
#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)会抛出异常
break
def findModule(self, procName):
try:
return module_list[procName]
except:
logging.debug("module_list[%s] not found" % (procName))
return None
#根据报文名称调用对应的模块,并传递参数,将执行结果返回给客户端
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"
if __name__ == "__main__":
host = "" #主机名,可以是ip,像localhost的主机名,或""
port = 9999 #端口
addr = (host, port)
server = ThreadingTCPServer(addr, MyBaseRequestHandler)
server.serve_forever()