如何通过 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 server1
和 xterm server2
和然后在打开的 xterm 终端上使用命令 python3 xmlrpc_server.py
和 python3 xmlrpc_client.py
),但我需要通过 python 脚本启动服务器和客户端,以便在通信后执行一些进一步的计算在两个服务器之间。
将 print(net.hosts[0].cmd('python3 xmlrpc_server.py'))
替换为 print(net.hosts[0].sendCmd('python3 xmlrpc_server.py'))
。连接有时会被拒绝,但这个问题可以通过客户端脚本上的异常处理来解决。
我正在尝试 运行 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 server1
和 xterm server2
和然后在打开的 xterm 终端上使用命令 python3 xmlrpc_server.py
和 python3 xmlrpc_client.py
),但我需要通过 python 脚本启动服务器和客户端,以便在通信后执行一些进一步的计算在两个服务器之间。
将 print(net.hosts[0].cmd('python3 xmlrpc_server.py'))
替换为 print(net.hosts[0].sendCmd('python3 xmlrpc_server.py'))
。连接有时会被拒绝,但这个问题可以通过客户端脚本上的异常处理来解决。