http://docs.python.org/tutorial/errors. ... exceptions
Tipp: du hast keinen ValueError
Kommunizieren
Vor allem weil du noch ein ziemlicher Neuling zu sein scheinst, und es damit nicht nur dir, sondern momentan auch uns sehr schwer machstHyperion hat geschrieben:Hast Du uns eigentlisch schon mal erklärt, wieso Du mit Sockets arbeiten willst? (Du schriebst ja nur, dass Du Dir jede Menge Probleme einhandeln willst - aber wieso nur?)
Für Programmierer mit wenig Python-Erfahrung empfiehlt es sich sehr, auf eine Lösung zu setzen, die das ganze Sockethandling abstrahiert.
@coolerj: `socket.error` hat als `args`-Attribut ein Tupel das als erstes Element die Fehlernummer und als zweites den Text enthält.
Allerdings sind beide Betriebssystemabhängig.
Allerdings sind beide Betriebssystemabhängig.
Ok ihr wollt mir nicht helfen sagst doch gleich.
Damit kommt zwar die meldung aber stürtz immer noch ab:
Damit kommt zwar die meldung aber stürtz immer noch ab:
Code: Alles auswählen
if socket.error(10054):
print "Es hat einer eine Verbindung getrennt."
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ok, Du willst uns nicht antworten.coolerj hat geschrieben:Ok ihr wollt mir nicht helfen sagst doch gleich.
...
...
...
...
...
...
Denk doch mal drüber nach, was es bedeutet, wenn sich jemand die Mühe macht inhaltliche Rückfragen an Dich zu stellen! Und wenn Du das richtig analysiert hast, denk noch mal über Deine Aussage nach und reagiere in Zukunft einfach angemessen.
Aber um Dich jetzt glücklich zu machen:
Code: Alles auswählen
try:
# was auch immer Du machst
except socket.error as error:
print error
Aber dann bricht er ja wieder ab.
Code: Alles auswählen
import socket
import shutil
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 50000))
s.listen(1)
try:
while True:
komm, addr = s.accept()
while True:
data = komm.recv(1024)
if not data:
komm.close()
break
#print "[%s] %s" % (addr[0], data)
array = data.split()
datei = "log.txt";
if array[0] == "/kill":
print "[%s] hat die Funktion 'kill' aufgerufen" % (addr[0])
files = open(datei,"a")
files.write("\n[%s] hat die Funktion 'kill' aufgerufen\n" % (addr[0]))
files.write("[%s]" % (data))
files.close()
if array[0] == "/set":
print "[%s] hat die Funktion 'set' aufgerufen" % (addr[0])
files = open(datei,"a")
files.write("\n[%s] hat die Funktion 'set' aufgerufen\n" % (addr[0]))
files.write("[%s]" % (data))
files.close()
if array[0] == "/move":
print "[%s] hat die Funktion 'move' aufgerufen" % (addr[0])
files = open(datei,"a")
files.write("\n[%s] hat die Funktion 'move' aufgerufen\n" % (addr[0]))
files.write("[%s]" % (data))
files.close()
if array[0] == "/archiv":
shutil.move(datei, "./archiv/%s-log.txt" % (array[1]))
if socket.error(10054):
print "Es hat einer eine Verbindung getrennt."
except socket.error as error:
print error
finally:
s.close()
Hiho also wenn du unbedingt sockets benutzen willst:
ein paar Tipps am Rande:
-keinen Port unter 1024 benutzen, die brauchen root rechte
-bei dem Beispiel hier ist es egal ob der server an ist, der client schickt einfach man drauf los (UDP)
-falls du was wieder vom Server zum Client zurückschicken willst brauchst du TCP
-falls du von außerhalb deines Netztwerkes was zu dir schicken willst musst du die ports in deinem router freigeben
Hier 2 Code snippets die ich ohne weitere Änderungen und so auch ohne Garantie einfach mal hier reinkopiere, vielleicht helfen sie weiter
server.py (zum empfangen)
client.py (zum senden)
ein paar Tipps am Rande:
-keinen Port unter 1024 benutzen, die brauchen root rechte
-bei dem Beispiel hier ist es egal ob der server an ist, der client schickt einfach man drauf los (UDP)
-falls du was wieder vom Server zum Client zurückschicken willst brauchst du TCP
-falls du von außerhalb deines Netztwerkes was zu dir schicken willst musst du die ports in deinem router freigeben
Hier 2 Code snippets die ich ohne weitere Änderungen und so auch ohne Garantie einfach mal hier reinkopiere, vielleicht helfen sie weiter
server.py (zum empfangen)
Code: Alles auswählen
#!/usr/bin/env python
#THIS IS ONLY AN EXAMPLE CODE
# Server
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = '' # Auf dem server kann man das leer lassen
#~ port = int(sys.argv[1])
port = 12345
s.bind((host, port))
print "===Server gestartet==="
while True:
data,addr = s.recvfrom(1024)
print "Got data ==>" + data
s.close()
Code: Alles auswählen
#!/usr/bin/env python
#THIS IS ONLY AN EXAMPLE CODE
# Client
import socket
# Socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#~ host = sys.argv[1]
#~ port = int(sys.argv[2])
host = 'localhost'
port = 12345
s.sendto("Client connected",(host, port))
print "====Client gestartet==="
v = ''
t = ''
while True:
input = raw_input("Was soll ich senden? ")
s.sendto(input,(host, port))
s.close()
Zuletzt geändert von XXLTomate am Montag 6. Juni 2011, 17:10, insgesamt 1-mal geändert.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Dann musst Du den try...except Block eben in die Schleife(en) verlegen... man sollte i.A. immer nur so wenig Code wie möglich in solche Blöcke legen und vor allem nur wirklich um die Stellen, an denen eine Exception möglich ist.
In Deinem Fall nehme ich mal an, dass das s.accept() diese Exception wirft? (Oder das komm.recv() ?) Dann musst Du den Block eben nur um diese Stelle basteln.
Mal so am Rande ist der Code in der "Mitte" auch ziemliche copy&paste Programmierung. Wieso immer wieder eine Datei öffnen und den selben formatierten Text da rein schreiben? Zudem: Es gibt ein prima logging-Modul - evtl. wäre das eine Alternative?
Und den Rest kannst Du auch besser mit einem Dictionary zusammenfassen:
Und zur Erinnerung: Du bist immer noch nicht auf die Frage eingegangen, wieso Du "das" mit sockets lösen willst
In Deinem Fall nehme ich mal an, dass das s.accept() diese Exception wirft? (Oder das komm.recv() ?) Dann musst Du den Block eben nur um diese Stelle basteln.
Mal so am Rande ist der Code in der "Mitte" auch ziemliche copy&paste Programmierung. Wieso immer wieder eine Datei öffnen und den selben formatierten Text da rein schreiben? Zudem: Es gibt ein prima logging-Modul - evtl. wäre das eine Alternative?
Und den Rest kannst Du auch besser mit einem Dictionary zusammenfassen:
Code: Alles auswählen
def handle_cmd(filename, sender, data, cmd):
message = u"[{0}] hat die Funktion '{1}' aufgerufen".format(sender, cmd)
with open(filename, "a") as outfile:
outfile.write(message)
outfile.write(u"[{0}]".format(data))
print message
def handle_archiv(filename, sender, data, cmd):
shutil.move(datei, r"./archiv/%s-log.txt".format(data.split()[1]))
def listen():
"""
lagere alle Netzwerkkommunikation hier rein
"""
commands = {
"/kill": handle_cmd,
"/set": handle_cmd,
"/move": handle_cmd,
"/archiv": handle_archiv
}
filename = r"was auch immer"
# Stelle an der sonst diese if-Kaskade auftaucht:
commands[array[0]](filename, addr[0], data, array[0])
# und weiter
Hatte ich jetzt auf die schnelle keine lust . hab das mit den sockets vor ein paar jahren mal gemacht und konnte mich nicht mehr ganz dran erinnernEyDu hat geschrieben:Nicht nur das. Du solltest vielleicht noch einmal die Wikipedia-Artikel dazu lesenXXLTomate hat geschrieben:*ich hoff ich habs nicht verwechselt
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nichts für ungut, aber vielleicht sollte man dann lieber nicht posten, denn das was dort steht ist teilweise so falsch, dass man hofft dass das keiner ernst nimmt.XXLTomate hat geschrieben:Hatte ich jetzt auf die schnelle keine lust . hab das mit den sockets vor ein paar jahren mal gemacht und konnte mich nicht mehr ganz dran erinnern
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lol was ist daran so falsch?Leonidas hat geschrieben:Nichts für ungut, aber vielleicht sollte man dann lieber nicht posten, denn das was dort steht ist teilweise so falsch, dass man hofft dass das keiner ernst nimmt.XXLTomate hat geschrieben:Hatte ich jetzt auf die schnelle keine lust . hab das mit den sockets vor ein paar jahren mal gemacht und konnte mich nicht mehr ganz dran erinnern
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
So ziemlich alles was du ueber TCP und UDP gesagt hast. Und benutze bitte kein while 1.
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Und schon gar kein `while(1)`Rebecca hat geschrieben:Und benutze bitte kein while 1.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Wollt ihr mich Verarschen ich jetzt den block in der Schleife getan aber dann geht garnichts mehr
Code: Alles auswählen
import socket
import shutil
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 50000))
s.listen(1)
try:
while True:
komm, addr = s.accept()
while True:
data = komm.recv(1024)
if not data:
komm.close()
break
#print "[%s] %s" % (addr[0], data)
array = data.split()
datei = "log.txt";
if array[0] == "/kill":
print "[%s] hat die Funktion 'kill' aufgerufen" % (addr[0])
files = open(datei,"a")
files.write("\n[%s] hat die Funktion 'kill' aufgerufen\n" % (addr[0]))
files.write("[%s]" % (data))
files.close()
if array[0] == "/set":
print "[%s] hat die Funktion 'set' aufgerufen" % (addr[0])
files = open(datei,"a")
files.write("\n[%s] hat die Funktion 'set' aufgerufen\n" % (addr[0]))
files.write("[%s]" % (data))
files.close()
if array[0] == "/move":
print "[%s] hat die Funktion 'move' aufgerufen" % (addr[0])
files = open(datei,"a")
files.write("\n[%s] hat die Funktion 'move' aufgerufen\n" % (addr[0]))
files.write("[%s]" % (data))
files.close()
if array[0] == "/archiv":
shutil.move(datei, "./archiv/%s-log.txt" % (array[1]))
except socket.error as error:
if socket.error(10054):
print "Es hat einer eine Verbindung getrennt."
finally:
s.close()