netzwerk_server-client.py
netzwerk_server-client.py — text/python-source, 3 KB (3396 bytes)
Dateiinhalt
""" Demonstration der Kommunikation uebers Netzwerk Die Klasse Spieler implementiert sowohl Server als auch Client: der eigene Server fuehrt die Aktionen des Gegenueber aus, der Client sendet die Anweisungen dorthin. """ import socket # Modul f. Netzwerkverbindung from threading import Thread # Modul f. Nebenlaeufigkeit from visual import * # 3D-Modul # Portnummer und Hostadresse des Fremdservers: bei Bedarf aendern FremdPORT=8000 # Port des Fremdservers HOST="141.84.220.92" # Adresse des Gegenueber EigenPORT=8001 # Port des eigenen Servers # Zwei Kugeln: die eine, eigene wird ueber die Tastatur gesteuert, # die andere wird vom Mitspieler uebers Netzwerk gelenkt. objekte = [sphere(pos=(1,0,0), color=color.yellow, opacity=0.8),\ sphere(pos=(-1,0,0), color=color.green, opacity=0.8)] class Spieler(Thread): """Schnelle Verbindung zu Server""" def __init__(self, host=HOST, fport=FremdPORT, eport=EigenPORT): Thread.__init__(self) self.host = host self.fport = fport self.eport = eport # UDP-Socket fuer Clientfunktion self.f = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP-Socket fuer Eigenserver self.e = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.e.bind(("",eport)) def run(self): # interne Startmethode des Threads while True: # Endlosschleife der Serverausgabe (50 Zeichen) try: # Versuch, die Nachricht vom Gegenueber umzusetzen info = self.e.recvfrom(50)[0] exec(info) except: print "Fehler beim Ausfuehren von Serveranweisung" def action(self,id): # startet den Client, indem self.start() # der Thread aufgerufen wird while True: # Endlosschleife bis Nachricht versandt rate(50) # 50 Frames pro Sekunde if scene.kb.keys: #Tastatur gedrueckt? s = scene.kb.getkey() print s if s == 'left': # links objekte[id].x += -1 elif s == 'right': # right objekte[id].x += 1 elif s == 'up': # vor objekte[id].z -= 1 elif s == 'down': # zurueck objekte[id].z += 1 else: # auf Ursprung setzen; Geschw. null; Kamera ran objekte[id].pos = (0,0,0) self.f.sendto("objekte[%s].pos=(%s,%s,%s)"\ %(id,objekte[id].x,objekte[id].y,objekte[id].z),\ (self.host, self.fport)) # Versand der Anweisung an Gegenueber if mag(objekte[0].pos-objekte[1].pos)<2: # Kollisionserkennung: Farbaenderung objekte[0].color=color.blue objekte[1].color=color.magenta else: objekte[0].color=color.yellow objekte[1].color=color.green if __name__ == "__main__": s=Spieler() # Hier Hostadresse, FremdPort, Eigenport dem Konstruktor uebergeben s.action(0) # 0 = gelbe Kugel, 1 = gruene