def main(): # start local server to respond to pings and whatnot thrd = threading.Thread(target=server.loop, args=(protocol.node.handler,)) thrd.daemon = True # to ensure program exits even if thrd still runs thrd.start() while 1: # look for things the server might want to know local_changes = statistics.gather() print 'Local changes:',local_changes node_changes = watcher.gather() print 'Node changes:',node_changes # and send them to the server try: s = client.connect(MASTER_ADDR) # 1: data push request = protocol.master.push_request(local_changes, node_changes) stamp,version,do_clear_cache = protocol.master.push_response( client.ask(s, request)) print 'Data pushed to server.' if do_clear_cache: print 'Cache cleared due to server request.' statistics.cache = {} watcher.cache = {} # check if we're out of date if version>conf.VERSION: print 'Client of out date!' print 'Version %d, latest is %d.' % (conf.VERSION, version) print 'Exiting.' import sys sys.exit(1) # 2: node list request print 'Node timestamps, server:',stamp,'mine:',neighbours.stamp if stamp!=neighbours.stamp: # request update! request = protocol.master.nodes_request() stamp,nodes = protocol.master.nodes_response( client.ask(s, request)) print 'Received',len(nodes),' new nodes with stamp:',stamp neighbours.set(stamp,nodes) client.close(s) except: import traceback traceback.print_exc() print 'Failed to connect to server. Aborting communication.' # since the server didn't get our date (and is probably down!) # we really should clear our cache, to ensure the server gets a # full picture statistics.cache = {} watcher.cache = {} # then wait, to not waste resourses print 'Sleeping...' try: time.sleep(POLLING_INTERVAL) except KeyboardInterrupt: print 'Exiting.' return 0
def multiplayer(server): events = [] client = socket_connection.client(server) players = client.ask(repr(["get_players", "", ""])).replace("\n", "").replace("\r", "").split(",") #M# Menü unterschiedlich gestalten jenachdem wie viele Spieler es gibt # und ob das erstellen neuer Spieler erlaubt ist playerlist = ([("Select Player", 1, (127, 0, 255))] + [(player, ) for player in players] + [("Back", )]) i_player = Display.menu(playerlist)[0] if i_player == -1: return -1 if i_player == len(playerlist) - 1: return 0 playername = playerlist[i_player][0] password = "" random_key = client.ask(repr(["random_key", playername, ""])) random_key = random_key.replace("\n", "").replace("\r", "") combined_key = password + random_key hashed_combined_key = hashlib.md5(combined_key).hexdigest() reply = client.ask(repr(["login", playername, hashed_combined_key])) print reply if reply.startswith("access denied"): return #Display = IOlib.Display(datadir,playername,controlsfile) t = time.time() while True: objectlist = Display.get_required_objects() # client -> server: events, playername, objectlist request = repr([events, playername, objectlist]) answer = client.ask(request) displaydata = ast.literal_eval(answer) # server -> client: displaydata if "QUIT" in [event[0] for event in events]: break #muss nach Datenübertragung kommen, damit server quit event noch bekommt events = Display.show(displaydata, playername) while time.time() - t < 0.0625: time.sleep(0.001) t += 0.0625 return 0
def has_monitord(hostname): 'Check if the host has monitord runing by trying to connect and ping.' try: s = client.connect(hostname) return client.ask(s, protocol.node.ping())=='pong' except: return False
def multiplayer(server): events = [] client = socket_connection.client(server) players = client.ask(repr(["get_players","",""])).replace("\n","").replace("\r","").split(",") #M# Menü unterschiedlich gestalten jenachdem wie viele Spieler es gibt # und ob das erstellen neuer Spieler erlaubt ist playerlist = ([("Select Player",1,(127,0,255))]+ [(player,) for player in players]+ [("Back",)]) i_player = Display.menu(playerlist)[0] if i_player == -1: return -1 if i_player == len(playerlist)-1: return 0 playername = playerlist[i_player][0] password = "" random_key = client.ask(repr(["random_key",playername,""])) random_key = random_key.replace("\n","").replace("\r","") combined_key = password+random_key hashed_combined_key = hashlib.md5(combined_key).hexdigest() reply = client.ask(repr(["login",playername,hashed_combined_key])) print reply if reply.startswith("access denied"): return #Display = IOlib.Display(datadir,playername,controlsfile) t = time.time() while True: objectlist = Display.get_required_objects() # client -> server: events, playername, objectlist request = repr([events,playername,objectlist]) answer = client.ask(request) displaydata = ast.literal_eval(answer) # server -> client: displaydata if "QUIT" in [event[0] for event in events]: break #muss nach Datenübertragung kommen, damit server quit event noch bekommt events = Display.show(displaydata,playername) while time.time()-t<0.0625: time.sleep(0.001) t+=0.0625 return 0