通过UDP的RPC
storjrpcudp的Python项目详细描述
#RPC UDP:[RPC](http://en.wikipedia.org/wiki/Remote_procedure_call)over[UDP](http://en.wikipedia.org/wiki/User_Datagram_Protocol)in Python
RPC over UDP似乎是一个愚蠢的想法,但是像[DHT]这样的东西(http://en.wikipedia.org/wiki/Distributed_hash_table)[Kademlia](http://en.wikipedia.org/wiki/Kademlia)需要它此项目专门为异步[python twisted](http://twistedmatrix.com)代码设计,用于接受和发送远程过程调用。
这在库中不被视为异常状态,但您将知道服务器是否在可配置的时间内未收到响应。
让我们创建一个接受远程过程调用并启动它的服务器。
``python
from rpcudp.protocol import rpcprotocol
from twisted.internet import reactor
名称:
#这也可能返回延迟的发送方是(IP,端口)
返回“您好,您住在%s:%i”%(名称,发送方[0],发送方[1])
请注意,我们也需要为客户端指定一个端口,因为它需要监听对udp端口上的rpc调用的响应。
``python
from rpcudp.protocol import rpcprotocol
from twisted.internet import reactor
class rpc client(rpcprotocol):
def handleresult(self,result):
-第一个参数是一个布尔值,指示是否接收到响应
,第二个参数是接收到响应的响应。
如果结果[0]:
打印“成功!%s“%result[1]
否则:
打印“未收到响应”。
client=rpcclient()
reactor.listenudp(5678,client)
client.sayhi(('127.0.0.1',1234),“snake plissken”).addcallback(client.handleresult)
reactor.run()
````
您可以在根文件夹中的example.py文件中运行此示例。
python对象使用[msgpack]序列化(http://msgpack.org/)。所有调用都必须在8K内(通常小到可以容纳一个数据报数据包)。
在版本2.0中,进行远程调用时的方法名始终打包为Unicode字符串。在以前的版本中,方法名的字符串类型取决于python版本。为了使在python 2和python 3上运行的实例彼此兼容,方法名在打包之前现在被编码为unicode字符串,这确保了[u-msgpack-python](https://github.com/vsergeev/u-msgpack-python)总是以相同的方式打包。有关详细信息,请参阅[u-msgpack-python behavior notes](https://github.com/vsergeev/u-msgpack-python behavior notes)。
RPC over UDP似乎是一个愚蠢的想法,但是像[DHT]这样的东西(http://en.wikipedia.org/wiki/Distributed_hash_table)[Kademlia](http://en.wikipedia.org/wiki/Kademlia)需要它此项目专门为异步[python twisted](http://twistedmatrix.com)代码设计,用于接受和发送远程过程调用。
这在库中不被视为异常状态,但您将知道服务器是否在可配置的时间内未收到响应。
让我们创建一个接受远程过程调用并启动它的服务器。
``python
from rpcudp.protocol import rpcprotocol
from twisted.internet import reactor
#这也可能返回延迟的发送方是(IP,端口)
返回“您好,您住在%s:%i”%(名称,发送方[0],发送方[1])
请注意,我们也需要为客户端指定一个端口,因为它需要监听对udp端口上的rpc调用的响应。
``python
from rpcudp.protocol import rpcprotocol
from twisted.internet import reactor
class rpc client(rpcprotocol):
def handleresult(self,result):
-第一个参数是一个布尔值,指示是否接收到响应
,第二个参数是接收到响应的响应。
如果结果[0]:
打印“成功!%s“%result[1]
否则:
打印“未收到响应”。
client=rpcclient()
reactor.listenudp(5678,client)
client.sayhi(('127.0.0.1',1234),“snake plissken”).addcallback(client.handleresult)
reactor.run()
````
您可以在根文件夹中的example.py文件中运行此示例。
python对象使用[msgpack]序列化(http://msgpack.org/)。所有调用都必须在8K内(通常小到可以容纳一个数据报数据包)。
在版本2.0中,进行远程调用时的方法名始终打包为Unicode字符串。在以前的版本中,方法名的字符串类型取决于python版本。为了使在python 2和python 3上运行的实例彼此兼容,方法名在打包之前现在被编码为unicode字符串,这确保了[u-msgpack-python](https://github.com/vsergeev/u-msgpack-python)总是以相同的方式打包。有关详细信息,请参阅[u-msgpack-python behavior notes](https://github.com/vsergeev/u-msgpack-python behavior notes)。