空闲时间完善了一下RPC交互的demo,
后续有新进展会继续连载。
client.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
import re,json,os,log,uuid errorMessage = ''' ========================================= arkClient useage: client = arkClient() client.call("api.run", args) client.api.run(args) ========================================= ''' from socket import * from time import ctime def run(data): bufsize = 1024 host = '127.0.0.1' port = 8100 addr = (host,port) client_sock = socket(AF_INET,SOCK_STREAM) client_sock.connect(addr) running = True while running: client_sock.sendall(data) data = client_sock.recv(bufsize) print('收到---->%s %s' %(ctime(),data)) running = False client_sock.close() return data.decode("utf-8") class ArkServProxy: """ The service proxy. """ __serviceName__ = None __functionList__ = {} __meta__ = {} def __init__(self, *args, **kwargs): if "__meta__" in kwargs: self.__meta__ = dict(self.__meta__, **kwargs.get("__meta__")) def setServiceName(self, serviceName): self.__serviceName__ = serviceName def __getattr__(self, functionName, *args, **kwargs): if not functionName in self.__functionList__ : self.__functionList__[functionName] = self.FunctionExecutor(__meta__=self.__meta__) self.__functionList__[functionName].setFunctionName(functionName) self.__functionList__[functionName].setServiceName(self.__serviceName__) return self.__functionList__[functionName].execute def __call__(self): raise Exception(errorMessage) def __str__(self): raise Exception(errorMessage) class FunctionExecutor: """ To building the param, call the remote function and get the result. """ __serviceName__ = None __functionName__ = None __meta__ = {} def setFunctionName(self, name): self.__functionName__ = name def setServiceName(self, name): self.__serviceName__ = name def __init__(self, *args, **kwargs): if "__meta__" in kwargs: self.__meta__ = dict(self.__meta__, **kwargs.get("__meta__")) def __call__(self): raise Exception(errorMessage) def __str__(self): raise Exception(errorMessage) def execute(self, *args, **kwargs): log.info("call remote service:" + self.__serviceName__ + "." + self.__functionName__) requestId = str(uuid.uuid4()) meta = { "__serviceName__":self.__serviceName__, "__functionName__":self.__functionName__, "__requestId__":requestId } meta = dict(meta, **self.__meta__) data = { '__meta__': meta, 'data': { 'args': args, 'kwargs': kwargs } } data = json.dumps(data) return run(data.encode()) class ArkServClient: serviceList = {} __meta__ = { "__clientVersion__" : "1.0.0.beta" } def __init__(self, **configs): config_file = 'config.json' if "config_file" in configs: config_file = configs["config_file"] config_file = os.path.abspath(config_file) config_exists = os.path.exists(config_file) if not config_exists: log.error("config file does not exists") else: config_fd = open(config_file) if config_fd.readable(): config = "".join(config_fd.readlines()) config = json.loads(config) print(config.get('ArkServ')) log.info("ArkServClient init!") def __getattr__(self, serviceName): if not serviceName in self.serviceList: self.serviceList[serviceName] = ArkServProxy(__meta__ = self.__meta__) self.serviceList[serviceName].setServiceName(serviceName) return self.serviceList[serviceName] def setMeta(self, meta): keys = meta.keys() for key in keys: if not key in self.__meta__: self.__meta__[key] = meta[key] log.info("key %s merge into meta" % key) else: log.warn("meta key %s exists, not allow merge into meta" % key) def call(self, serviceName, *args, **kwargs): if not re.match('^[\w.]+$', serviceName): raise Exception(errorMessage) service = serviceName.split('.') if service.__len__() == 2: remoteService = self.__getattr__(service[0]) return remoteService.__getattr__(service[1])(*args, **kwargs) else: log.error(errorMessage) raise Exception(errorMessage) ''' 简单的调用测试 ''' client = ArkServClient(config_file="config.json") client.setMeta({"xxxxxxxx":"aaaaaaa"}) res1 = client.member.aaa("xxx2x", a="x1x") print(res1) res3 = client.member.bbb("xxx2xxxxx", c="x1x222222", d={"xxx":"aaaaa"}) print(res3) res2 = client.call("memberaa.aa", "xxxx", a="xx") print(res2) |
简单接收socket请求然后写死了执行代码模拟一下交互
server.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import socket,json bufsize = 1024 host = '127.0.0.1' port = 8100 address = (host,port) server_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server_sock.bind(address) server_sock.listen(1) def run(*args, **kwargs): print(args) print(kwargs) while True: print('waiting for connection...') clientsock,addr = server_sock.accept() print('received from :',addr) data = clientsock.recv(bufsize) if len(data) > 0: jsondata = data.decode("utf-8") data = json.loads(jsondata) args = data.get('data').get('args') args = tuple(args) kwargs = data.get('data').get('kwargs') kwargs = dict(kwargs) run(*args, **kwargs) clientsock.sendall(b"ok") |
log.py
1 2 3 4 5 6 7 8 9 10 11 |
def info(message): dolog("INFO", message) def warn(message): dolog("WARN", message) def error(message): dolog("ERROR", message) def dolog(level, message, **kwargs): print("[%s] %s" % (level, message)) |