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