2014-02-14 3 views
1

Я пытаюсь подключить два компьютера через XML RPC, но всегда получаю сообщение «[Errno -2] Name or service not known». Иногда это работает, а в других случаях это не так, и я не знаю, что я делаю неправильно. Вот код, который я бегуОшибка функции XMLRPC python

клиента (на одном компьютере):

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) 

сервера (на другом компьютере, адрес которого '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 [email protected]:~/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() 

Сервер является предназначенный для запуска как узел ROS, но я преобразовал его обратно в обычный python на случай, если вы хотите его запустить. Если вы хотите запустить его, обязательно измените URI соответствующим образом.

Большое спасибо

ответ

1

Чаще всего эта ошибка просто означает, что он не может подключиться к указанному хосту. Вы пробовали пинговать эти машины, чтобы убедиться, что они встали? Также может быть, что python не может разрешить локальный хост (который, если я не ошибаюсь, является частью протокола Bonjour от Apple), вам может понадобиться вместо этого использовать IP-адрес.

+0

Я вижу. Имя хоста здесь поддельное, и я жестко запрограммировал его просто, чтобы показать в качестве примера, но он будет зависеть от каждой машины. Обычно я получаю имя хоста. import platform hostname = platform.node() Я попытался использовать IP-адрес вместо имени хоста, но не смог даже подключиться, когда я это сделал. Я постараюсь постоянно пинговать машину, пока я запускаю код и вижу, что происходит. Спасибо за помощь! – Pototo

Смежные вопросы