RPC on my server

下面是之前我们给出的tcpserver中的一个函数,用来处理连接
  1. def _handle_connect(self, sock):
  2. conn = self._build_class(sock, **self._build_kwargs)
  3. self.on_connect(conn)
  4. close_callback = functools.partial(self.on_close, conn)
  5. conn.set_close_callback(close_callback)
build_class之前我们说过,这是我们用来处理数据的protocol,那么rpc的逻辑流程应该都写在这里。现在假设client来调用一个函数sum(x, y), 那么在我们server中就要有这样一个函数。
  1. def sum(x, y):
  2. return x+y

但是客户端来调用,我们如何知道server有这样一个函数呢?这就需要我们提前去处理一下,将希望可以被client调用的函数存起来。

  1. def route(**options):
  2. def decorator(handler):
  3. msgid = options.pop('msgid', handler.__name__)
  4. elif not msgid in HANDLERS:
  5. HANDLERS[msgid] = handler
  6. else:
  7. raise Exception('[ ERROR ]Handler "%s" exists already!!' % msgid)
  8. return handler
  9. return decorator

比如我们可以写这样一个函数,作为装饰器,来将被装饰的函数存起来(HANDLERS), 这样在client调用sum的时候,我们就可以知道,server中是否存在sum这个函数。

  1. @route()
  2. def sum(x, y):
  3. return x+y

这样函数被装饰起来以后,我们就可以找到这个函数了。当我们知道存在sum这个函数的时候,我就可以从HANDLERS中讲sum取出来,sum = HANDLERS.get('sum'), 然后我们讲x,y两个参数传进去,算出结果,再将结果写回conn中,返回给client。至此,客户端调用服务器函数的大致流程就说完了。