Created
March 6, 2020 14:52
-
-
Save stoensin/429c1e824eddbddff0ec94efd5ed50b7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class TCPClient: | |
| def __init__(self): | |
| self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| def connect(self, host, port): | |
| '''链接Server端''' | |
| self.sock.connect((host, port)) | |
| def send(self, data): | |
| '''将数据发送到Server端''' | |
| self.sock.send(data) | |
| def recv(self, length): | |
| '''接受Server端回传的数据''' | |
| return self.sock.recv(length) | |
| class RPCProcessor: | |
| def __getattr__(self, function): | |
| def _func(*args, **kwargs): | |
| d = {'method_name': function, 'method_args': args, 'method_kwargs': kwargs} | |
| self.send(json.dumps(d).encode('utf-8')) # 发送数据 | |
| data = self.recv(1024) # 接收方法执行后返回的结果 | |
| return data | |
| setattr(self, function, _func) | |
| return _func | |
| class RPCClient(TCPClient, RPCProcessor): | |
| pass | |
| import rpcclient | |
| c = rpcclient.RPCClient() | |
| c.connect('127.0.0.1', 5000) | |
| res = c.add(1, 2, c=3) | |
| print(f'res: [{res}]') |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class TCPServer: | |
| def __init__(self): | |
| self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| def bind_listen(self, port): | |
| self.sock.bind(('0.0.0.0', port)) | |
| self.sock.listen(5) | |
| def accept_receive_close(self): | |
| '''获取Client端信息''' | |
| (client_socket, address) = self.sock.accept() | |
| msg = client_socket.recv(1024) | |
| data = self.on_msg(msg) | |
| client_socket.sendall(data) # 回传 | |
| client_socket.close() | |
| class JSONRPC: | |
| def __init__(self): | |
| self.data = None | |
| def from_data(self, data): | |
| '''解析数据''' | |
| self.data = json.loads(data.decode('utf-8')) | |
| def call_method(self, data): | |
| '''解析数据,调用对应的方法变将该方法执行结果返回''' | |
| self.from_data(data) | |
| method_name = self.data['method_name'] | |
| method_args = self.data['method_args'] | |
| method_kwargs = self.data['method_kwargs'] | |
| res = self.funs[method_name](*method_args, **method_kwargs) | |
| data = {"res": res} | |
| return json.dumps(data).encode('utf-8') | |
| class RPCRegistry: | |
| def __init__(self): | |
| self.funs = {} | |
| def register_function(self, function, name=None): | |
| '''Server端方法注册,Client端只可调用被注册的方法''' | |
| if name is None: | |
| name = function.__name__ | |
| self.funs[name] = function | |
| class RPCServer(TCPServer, JSONRPC, RPCRegistry): | |
| def __init__(self): | |
| TCPServer.__init__(self) | |
| JSONRPC.__init__(self) | |
| RPCStub.__init__(self) | |
| def loop(self, port): | |
| # 循环监听 5000 端口 | |
| self.bind_listen(port) | |
| print('Server listen 5000 ...') | |
| while True: | |
| self.accept_receive_close() | |
| def on_msg(self, data): | |
| return self.call_method(data) | |
| import rpcserver | |
| def add(a, b, c=10): | |
| sum = a + b + c | |
| return sum | |
| s = rpcserver.RPCServer() | |
| s.register_function(add) # 注册方法 | |
| s.loop(5000) # 传入要监听的端口 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment