我创建了一个简单的RPC服务器来执行某些我们团队通用的任务,但是这些任务是从不同的网络调用的。服务器看起来是这样的(我不包括为简洁的错误处理):以简洁明了的方式向简单的RPC服务器添加方法
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
import json
class MyProtocol(Protocol):
def dataReceived(self, data):
req = json.loads(data) # create a dictionary from JSON string
method = getattr(self, req['method']) # get the method
method(req['params']) # call the method
def add(self, params):
result = {} # initialize a dictionary to convert later to JSON
result['result'] = sum(params)
result['error'] = None
result['id'] = 1
self.transport.write(json.dumps(result)) # return a JSON string
self.transport.loseConnection() # close connection
factory = Factory()
factory.protocol = MyProtocol
reactor.listenTCP(8080, factory)
reactor.run()
这是非常简单的:服务器接收来自客户端的JSON RPC请求,查找的方法,并调用该方法通过参数。该方法本身是返回JSON RPC响应的方法。对于不太熟悉,一JSON RPC看起来大约是这样的:
request:
{"method":"my_method", "params":[1,2,3], "id":"my_id"}
response:
{"result":"my_result", "error":null, "id":"my_id"}
因为我有我的服务宗旨电流很好的RPC服务器(你可以想像,我的任务很简单)。但随着任务复杂性的增加,我需要继续添加方法。
我不想打开主文件并添加另一个def method3(...)
,两周后添加def method4(...)
等等;代码会变得太快,维护将变得越来越困难。
所以,我的问题是:我怎么可以创建一个架构,让我寄存器方法到服务器。一个好处是可以有一个单独的文件夹,每个方法都有一个文件,这样他们可以很容易地被共享和维护。不管他们对Twisted的理解如何,这个“架构”也会让我推迟某些方法的维护。
我不在乎是否需要在每次注册新方法时重新启动服务器,但一个明显的优点是如果我不也有:)。
谢谢。
非常感谢您的回答。我不知道我最终会做什么,但你的方法是巧妙的,并使我走上正轨。 – Escualo 2010-07-07 22:12:46
目前,您的答案功能非常好。非常感谢! – Escualo 2010-07-12 23:08:36