netzwerk.py
netzwerk.py
—
Python Source,
4 KB (4729 bytes)
Dateiinhalt
# UDP-Server
# erhaelt den Port als Kommandozeilenargument geliefert
import socket,sys # Server-/Systemmodul
from threading import Thread
from visual import *
class udpServer(Thread, socket.socket):
"""modelliert UDP-Server, der den PORT als Kommandozeilenargument erhaelt"""
def __init__(self,port):
"Konstruktor"
Thread.__init__(self)
socket.socket.__init__(self, socket.AF_INET, socket.SOCK_DGRAM)
self.port=port
self.clients = []
def run(self):
"Starten des Servers"
try: # versucht ...
self.bind(("",self.port)) # alle IP-Adressen auf Client-PORT
while True: # laeuft solange bis Tastaturabbruch
daten, client = self.recvfrom(256) # holt Daten und Adresstupel von Bindung
if client not in self.clients:
self.clients.append(client)
if not daten: # kommt ein Leerstring...
self.close() # ...faehrt der Server herunter
#
# HIER WERDEN DIE DATEN VERARBEITET: CONTROLLER
#
print ("Server empfaengt: "+daten+" von "+str(client))
if daten == "nummer?":
self.sendto("self.nummer="+str(self.nummer_geben(client)),client)
else:
for r in self.clients:
self.sendto(daten,r)# Antwort
finally: # ... wird AUF JEDEN FALL ausgefuehrt:
self.close() # Verbindung schliessen
def nummer_geben(self,client):
for i in range (len(self.clients)):
if self.clients[i]==client:
return i
###############################
if __name__ == "__main__":
try:
port = int(sys.argv[1]) # hole Port-Angabe von der Kommandozeile...
except:
port = 50000 # andernfalls halt den 50000er!
s = udpServer(port) # Server mit Port instanziieren
s.run() # und starten
# todo: automatisch abschalten via len(clients)<1...
###############################
PORT=50000
class Verbinder(Thread):
def __init__(self, benutzer, port =PORT):
Thread.__init__(self)
self.server = False
self.benutzer = benutzer
self.port = port
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # AF_INET = IPv4, SOCK_DGRAM = UDP
self.s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1) # Broadcast ermoeglichen
#testen, ob es schon einen server gibt
try:
self.s.sendto("print 'wer hoert mich?'",
('255.255.255.255', port)) # sende Nachricht 'an alle'
self.s.settimeout(2) # warte 1/2 Sekunde..
print (self.s.recvfrom(64)[0]) # gibt Servermeldung aus
#ein Problem, wenn timeout einmal gesetzt ist...
self.s.settimeout(3000)
except: # reagiert auf Zeitueberschreitung
import subprocess # Modul zum Starten von Subprozessen
print ("Kein Server vorhanden - starte Server") # Rueckmeldung
# subprocess.Popen(['python','server_class.py',str(port)]) # Server starten
subprocess.Popen(['python','netzwerk.py',str(port)]) # Server starten
self.s.setblocking(1) # nicht-blockierend
self.s.sendto("print 'hallo'", ('255.255.255.255', port))
self.server = True
finally:
pass
self.start()
def run(self):
while True:
self.empfangen()
def empfangen(self):
nachricht = self.s.recvfrom(128)[0]
self.benutzer.empfangen(nachricht)
def senden(self,nachricht):
self.s.sendto(nachricht, ('255.255.255.255', self.port)) # versenden der Nachricht an Tupel(IP, PORT)
##########################
class Teilnehmer():
def __init__(self, port = PORT):
self.verbinder = Verbinder(self, port)
def empfangen(self, nachricht):
#print ("Empfangene Nachricht: "+nachricht)
exec (nachricht)
def senden(self,nachricht):
self.verbinder.senden(nachricht)