2014-02-14 79 views
1

我想通過XML RPC連接兩臺計算機,但我總是得到「[Errno -2]名稱或服務未知」消息。有時候它是有效的,有時候它不會,我不知道我做錯了什麼。下面是我跑python XMLRPC函數錯誤

客戶端的代碼(一臺計算機上):

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) 

服務器

#!/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() 

服務器是一個(其地址爲 'http://pototo.local:12345' 另一臺計算機上)打算作爲一個ROS節點運行,但我把它轉換回普通的Python,以防萬一你想運行它。如果你想運行它,請確保相應地更改URI。

非常感謝您

回答

1

最常見的錯誤只是意味着它無法連接到指定的主機。你有沒有試過ping那些機器以確保它們起來?也可能是python無法解析.local主機(如果我沒有弄錯是Apple Bonjour協議的一部分),您可能需要使用IP地址。

+0

我明白了。 這裏的主機名稱是假的,我對它進行了硬編碼,只是作爲一個例子來展示,但是它會因每臺機器而異。 我通常以這種方式獲取主機名。 導入平臺 hostname = platform.node() 我嘗試使用IP地址而不是主機名,但它甚至無法連接,當我這樣做。 我會試着在運行代碼的同時持續ping機器,看看會發生什麼。 感謝您的幫助! – Pototo