当我将zerorpc服务器实例绑定到随机端口时,如下所示:
s = zerorpc.Server(SomeClass())
s.bind('tcp://127.0.0.1:0')
如何找出服务器实际绑定到哪个端口?导致相同目标的另一个问题:如何访问zerorpc服务器的底层ZMQ套接字?
为了找到套接字对象,我编写了一个函数,该函数递归搜索 vars(server_object) 中的任何 ZMQ 对象:
def find_sockets(obj, thiskey, keys_before, results):
if 'zmq.' in str(type(obj)):
results.append(keys_before + [thiskey])
try:
vars(obj)
except TypeError:
return
for key in vars(obj):
find_sockets(vars(obj)[key], key, keys_before + [thiskey], results)
s = zerorpc.Server(Dummy())
s.bind('tcp://*:0')
results = []
find_sockets(s, '', [], results)
我找到以下套接字对象:
server_object
├─ _multiplexer
│ ├─ _events
│ │ ├ _send
│ │ │ └─ _socket
│ │ ├─ _recv
│ │ │ └─ _socket
│ │ └─ _socket
├─ _events
│ ├ _send
│ │ └─ _socket
│ ├─ _recv
│ │ └─ _socket
│ └─ _socket
绑定后,调用 getsockopt(zmq.LAST_ENDPOINT) 在任何这些套接字对象上都为我提供了连接的端点,从而为我提供了端口。
但是,这可能不是零RPC开发人员的意图,也不能保证将来可以正常工作。因此,为了连接到随机自由端口,我现在要做的是获取一个随机端口,尝试绑定到它,然后重复直到没有 zmq。ZMQError 被抛出。