如何通过 python 脚本在 Mininet 主机上 运行 XMLRPC 服务器和 XMLRPC 客户端?

How to run an XMLRPC server and an XMLRPC client on Mininet hosts through a python script?

我正在尝试 运行 Mininet 主机上的 XMLRPC 服务器和 XMLRPC 客户端,使用下面的脚本。

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import OVSController


class MyTopo(Topo):

    def __init__(self):
        # Initialize topology
        Topo.__init__(self)

        # Add hosts
        server1 = self.addHost('server1')
        server2 = self.addHost('server2')

        # Add switch
        s1 = self.addSwitch('s1')

        # Add links
        self.addLink(server1, s1)
        self.addLink(server2, s1)


if __name__ == '__main__':
    net = Mininet(topo=MyTopo(), controller=OVSController)
    net.start()
    print(net.hosts[0].cmd('python3 xmlrpc_server.py'))
    print(net.hosts[1].cmd('python3 xmlrpc_client.py'))

文件xmlrpc_server.py是:

from xmlrpc.server import SimpleXMLRPCServer
import threading


def is_even(n):
    return n%2 == 0

server = SimpleXMLRPCServer(("0.0.0.0", 8000), logRequests=True, allow_none = True)
server.register_function(is_even, "is_even")
print("Listening on port 8000...")
server_thread = threading.Thread(target=server.serve_forever)
server_thread.start()

文件xmlrpc_client.py是:

import xmlrpc.client


proxy = xmlrpc.client.ServerProxy("http://10.0.0.1:8000/")
print("3 is even: %s" % str(proxy.is_even(3)))
print("100 is even: %s" % str(proxy.is_even(100)))

问题是虽然我使用了线程,但是当我运行服务器1上的xmlrpc_server.py脚本时,执行暂停在第server_thread.start()行等待脚本执行在继续之前完成,因此永远不会继续到下一行,这意味着 XMLRPC 客户端脚本永远不会 运行s。我该如何克服这个问题?

P.S.: xmlrpc_server.py 和 xmlrpc_client.py 可以通过服务器终端执行(通过在 Mininet CLI 上使用命令 xterm server1xterm server2 和然后在打开的 xterm 终端上使用命令 python3 xmlrpc_server.pypython3 xmlrpc_client.py),但我需要通过 python 脚本启动服务器和客户端,以便在通信后执行一些进一步的计算在两个服务器之间。

print(net.hosts[0].cmd('python3 xmlrpc_server.py')) 替换为 print(net.hosts[0].sendCmd('python3 xmlrpc_server.py'))。连接有时会被拒绝,但这个问题可以通过客户端脚本上的异常处理来解决。