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

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top