Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Probestudium / 2013 / WS I: 3D-Programmierung / Skripte (alte Fassungen) / netzwerk_server-client.py


Inhaltsbereich

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


Funktionsleiste