Most often that error just means it's unable to connect to the specified host. Have you tried pinging those machines to make sure they're up? It could also be that python isn't able to resolve the .local host (which if I'm not mistaken is part of Apple's bonjour protocol) and you may need to use an IP address instead.
python XMLRPC function error
-
11-10-2022 - |
Question
I am trying to connect two computers through XML RPC, but I always get the "[Errno -2] Name or service not known" message. Sometimes it works, and some other times it does not, and I don't know what I am doing wrong. Here is a the code I'm running
client (on one computer):
from xmlrpclib import ServerProxy
import time
while True:
try:
# robot_file = open("robot_file", "r")
# robot_uri = robot_file.readline()
robot_uri = "http://pototo.local:12345"
print("robot uri: " + robot_uri)
server = ServerProxy(robot_uri)
# robot_file.close()
# os.remove("robot_file")
print('removed robot_file')
break
except BaseException:
print("trying to read robot uri")
time.sleep(1)
pass
print('processing request')
while True:
try:
print (server.getLocationInfo(2))
time.sleep(1)
except BaseException as e:
print("trying to read request")
print (e)
time.sleep(1)
Server (on another computer whose address is 'http://pototo.local:12345')
#!/usr/bin/env python
'''
This files runs indefinitelly in a computer and waits for a client
to request connection to a/the robot(s)
'''
#import roslib;
#import rospy
#from sensor_msgs.msg import CompressedImage
#from sensor_msgs.msg import Image
#from std_msgs.msg import String
from SimpleXMLRPCServer import SimpleXMLRPCServer
import subprocess
from time import sleep
import string
pub_data = None # gets the data from the publisher
python_string = string
location = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
occupied = ['n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n']
flagged = ['n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n']
dateTime = ['None','None','None','None','None','None','None','None',
'None','None']
licensePlate = ['None','None','None','None','None','None','None',
'None','None','None']
gps = ['None','None','None','None','None','None','None','None',
'None','None']
def parking_callback(msg):
#parses the string data
infoList = msg.data.split(" ")
location[int(infoList[0]) -1] = infoList[0]
occupied[int(infoList[0]) -1] = infoList[1]
flagged[int(infoList[0]) -1] = infoList[2]
dateTime[int(infoList[0]) -1] = infoList[3]
licensePlate[int(infoList[0]) -1] = infoList[4]
def getLocationInfo(locationNum):
if ((locationNum > 10) and (locationNum < 1)):
print "Out of bounds location\n"
return
index = locationNum - 1
description = ('ID', 'occupied', 'flagged', 'dateTime',
'licensePlate', 'gps')
descrip_data = (location[index], occupied[index],
flagged[index], dateTime[index],
licensePlate[index], gps[index])
return dict(zip(description, descrip_data))
def start_process():
'''
Function that allows client to retrieve data from this server
'''
robot_address = ['http://G46VW:11311', '192.168.1.81']
print(str(len(robot_address)) + ' robots are connected \n')
# robot_address.append(os.environ['ROS_MASTER_URI'])
robot_address.reverse() # change uri as first key
return robot_address
# return location
def get_pub_data(published_data):
'''
Retrieves the published data from ROS and stores it on the
pub_data variable
'''
# pub_data = published_data
pass
if __name__ == '__main__':
#rospy.init_node('sendGUI')
#rospy.Subscriber('/parkingInfo', String, parking_callback)
import platform
hostname = platform.node()
port = 12345
server = SimpleXMLRPCServer((hostname, port))
# run subscriber here
# rospy.Subscriber("move", String, rover.set_move)
# thread to run the subscriber
#from threading import Thread
#spin_thread = Thread(target=lambda: rospy.spin())
#spin_thread.start()
# store server address for meta client usage
start = "http://"
address = start + hostname + ":" + str(port)
print('Robot URI: ' + address)
uri_file = open("robot_file", "w")
uri_file.write(address)
uri_file.close()
# send URI to client
# import os
# os.system("rsync -v -e ssh robot_file pototo@192.168.1.102:~/Desktop/gui")
server.register_function(start_process, "start_process")
server.register_function(getLocationInfo, "getLocationInfo")
#while not rospy.is_shutdown():
while True:
try: # handle requests for the rest of the program
print('\nwaiting for a client to request...\n\n')
server.handle_request()
except BaseException: #rospy.ROSInterruptException:
print('exiting ROS node')
# spin_thread.kill()
from sys import exit
exit()
The server is a intended to run as a ROS node, but I transformed it here back to normal python just in case you wanna run it. If you wanna run it, make sure to change the URI accordingly.
Thank you very much
Solution
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow