Skip to content

Instantly share code, notes, and snippets.

@stoensin
Created March 6, 2020 14:52
Show Gist options
  • Select an option

  • Save stoensin/429c1e824eddbddff0ec94efd5ed50b7 to your computer and use it in GitHub Desktop.

Select an option

Save stoensin/429c1e824eddbddff0ec94efd5ed50b7 to your computer and use it in GitHub Desktop.
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}]')
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