sockets mit listen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Conti
User
Beiträge: 3
Registriert: Mittwoch 26. Mai 2004, 21:50
Wohnort: Burscheid

Dienstag 1. Juni 2004, 22:06

Hallo,
ich bin neu hier und beschäftige mich als Quereinsteiger seit ca 3-4 Monaten mit Python.
Mein Problem daher mglw. etwas ungewöhnlich:
Ich möchte von einem Rechner aus Programme auf anderen Rechern durch einfache send-Befehle steuern. Die Rechner-Auswahl ist in Default-Dateien (data) festgelegt, kann jedoch vom User geändert werden.
Die maximale Rechneranzahl wird in 'connectable' definiert.
Da das Programm mittlerweile ca 500 Zeilen umfasst hier nur die relevante Klasse. Ich hoffe findige Programmierer können darunter was vorstellen
:oops:

Code: Alles auswählen

from socket import *
from Dateihandler import *
PORT 	= 5123 		# the same port as used by the server
ipONYX   ={
    "onyx1":"172.25.3.195","onyx2":"172.25.3.196","onyx3":"172.25.3.197",
    "onyx4":"172.25.3.199","onyx5":"172.25.3.193","onyx6":"172.25.3.194"} 
connectable=['OnyxA', 'OnyxB', 'OnyxC']

class Connection:
    def __init__(self):
        data=Dateihandler().get_Data()
        c=connectable
        sonyx=data.keys()
        OnyxA = socket(AF_INET, SOCK_STREAM)
        OnyxB = socket(AF_INET, SOCK_STREAM)
        OnyxC = socket(AF_INET, SOCK_STREAM)
        for i in c:
            if data[i]<> '':
                verbindung=str(i)+ '.connect' + '((' + '"' + ipONYX[data[i]] + '"' + ', ' + str(PORT) + '))'
                exec verbindung
Vielleicht denke ich ja zu kompliziert, aber da das ganze sehr flexibel gehandelt werden soll, wollte ich die Rechner mittel Schleife und Liste connecten. Das klappt auch, nur das im Millisekunden später die Connection von selber wieder geschlossen wird.
Der String sieht ziemlich verrückt aus, ich weiss. Mir ist aber nichts besseres eingefallen.
Ist die Listenidee falsch oder mache ich irgendwo einen anderen Fehler :?:
Hat jemand von euch eine bessere Idee?
Wie vorhin erwähnt das ganze soll mittels LowLeveNetworking funktionieren!
Danke schonmal,
Conti
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Dienstag 1. Juni 2004, 22:50

Hi Conti,

also wenn du mit z.B. "OnyxB.connect(...)" eine connection aufbaust, wirst Du einen Handle oder so zuückbekommen, den solltest Du dann in einer liste speichern, sonst wird der handle bei nächster Gelegenheit vom GC wieder geschlossen.

Gruß

Dookie
Conti
User
Beiträge: 3
Registriert: Mittwoch 26. Mai 2004, 21:50
Wohnort: Burscheid

Mittwoch 2. Juni 2004, 09:42

Hi Dookie,
vielen Dank für die schnelle Antwort.
Ich denke ich verstehe was du meinst:
Bei jedem Schleifendurchlauf wird die Variable verbindung neu
belegt.

Code: Alles auswählen

verbindung.append(...) 
sollte das Problem loesen
connecten werde ich danach mit

Code: Alles auswählen

for i in verbindung:
exec verbindung
korrekt?
gibt es eigentlich etwas eleganteres als dieses String-Monster?

Gruß Conti
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 2. Juni 2004, 12:40

so hab mir nochmal die Socket-Classe reingezogen.
Es liegt wohl daran, daß OnyxA, OnyxB und OnyxC locale Variablen sind, welche nur während der Laufzeit der __init__ Methode existieren, danach werden die Connections wieder gelöscht. Du musst die Klasse besser so realisieren.

Code: Alles auswählen

class Connection:
    def __init__(self):
        data=Dateihandler().get_Data()
        c=connectable
        sonyx=data.keys()
        self.sockets["OnyxA"] = socket(AF_INET, SOCK_STREAM)
        self.sockets["OnyxB"] = socket(AF_INET, SOCK_STREAM)
        self.sockets["OnyxC"] = socket(AF_INET, SOCK_STREAM)
        for i in c:
            if data[i]<> '':
                self.sockets[i].connect((ipONYX[data[i]], PORT))
Damit ersparst Du dir auch das Stringmonster und das unsichere exec. So sind in self.sockets die socket-Instanzen gesichert und solange das Connectionobjekt existiert bleiben die Verbindungen erhalten, ausser du schließt sie explizit mit einer entsprechenden Methode.


Gruß

Dookie
Conti
User
Beiträge: 3
Registriert: Mittwoch 26. Mai 2004, 21:50
Wohnort: Burscheid

Mittwoch 2. Juni 2004, 14:02

Cool,

das sieht schon auf den ersten Blick sehr gut aus,

ich danke dir, das hilft mir wirklich weiter,
Das mit den localen Variablen habe ich schon vermutet.
Ich war gerade dabei die ganze Verbinderei wieder ins Hauptmodul zu verfrachten, es hätte wohl funktioniert, wäre aber unschön gewesen.
So ist es wesentlich eleganter. :D

Tschüß,
Conti
Antworten