Seite 2 von 3

Verfasst: Sonntag 14. März 2010, 19:28
von coolerj
Ok ihr wollt mir nicht helfen sagst doch gleich.

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."

Verfasst: Sonntag 14. März 2010, 20:04
von Hyperion
coolerj hat geschrieben:Ok ihr wollt mir nicht helfen sagst doch gleich.
Ok, Du willst uns nicht antworten. :roll:
...
...
...
...
...
...
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
Damit sollte im Fehlerfall die Exception abgefangen und die Nachricht ausgegeben werden. Wie Du dann "weiter" machen kannst mit Deinem Code hängt vom konkreten Anwendungsfall ab.

Verfasst: Sonntag 14. März 2010, 20:19
von coolerj
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()

Verfasst: Sonntag 14. März 2010, 20:29
von XXLTomate
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)

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()
client.py (zum senden)

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()

Verfasst: Sonntag 14. März 2010, 20:40
von Hyperion
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:

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
Und zur Erinnerung: Du bist immer noch nicht auf die Frage eingegangen, wieso Du "das" mit sockets lösen willst ;-)

Verfasst: Sonntag 14. März 2010, 20:56
von EyDu
XXLTomate hat geschrieben:*ich hoff ich habs nicht verwechselt :-)
Nicht nur das. Du solltest vielleicht noch einmal die Wikipedia-Artikel dazu lesen ;-)

Verfasst: Sonntag 14. März 2010, 22:38
von XXLTomate
EyDu hat geschrieben:
XXLTomate hat geschrieben:*ich hoff ich habs nicht verwechselt :-)
Nicht nur das. Du solltest vielleicht noch einmal die Wikipedia-Artikel dazu lesen ;-)
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 :D

Verfasst: Sonntag 14. März 2010, 23:37
von Leonidas
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 :D
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.

Verfasst: Montag 15. März 2010, 09:27
von mkesper
Wieso hört eigentlich kein Newbie, was ihm vorgeschlagen wird?
"Ich verstehe zwar nichts von Python, aber was Ihr mir vorschlagt, will ich nicht!!1111"
:cry: :K :evil:

Verfasst: Montag 15. März 2010, 12:54
von XXLTomate
Leonidas hat geschrieben:
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 :D
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.
lol was ist daran so falsch?

Verfasst: Montag 15. März 2010, 13:44
von Rebecca
So ziemlich alles was du ueber TCP und UDP gesagt hast. Und benutze bitte kein while 1.

Verfasst: Montag 15. März 2010, 13:49
von cofi
Rebecca hat geschrieben:Und benutze bitte kein while 1.
Und schon gar kein `while(1)`

Verfasst: Montag 15. März 2010, 16:24
von XXLTomate
Rebecca hat geschrieben:So ziemlich alles was du ueber TCP und UDP gesagt hast.
Ja dann könnt ihr das hier ja richtig stellen und nicht nur "is falsch" sagen, so bringt es weder mir noch jemand anderem was.

Verfasst: Montag 15. März 2010, 16:37
von EyDu
Ich habe doch auf den Fehler und Wikipedia hingewiesen. Warum sollte hier jemand noch einmal vorkauen, was an anderer Stelle bereits ausführlich steht?

Verfasst: Montag 15. März 2010, 18:52
von coolerj
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()

Verfasst: Montag 15. März 2010, 18:54
von EyDu
Tu hast Teile des Blocks in eine Schleife verlagert.

Verfasst: Montag 15. März 2010, 18:57
von coolerj
Wenn ich es aber in der try mache ist der raus

Verfasst: Montag 15. März 2010, 19:10
von Hyperion
coolerj hat geschrieben:Wollt ihr mich Verarschen ich jetzt den block in der Schleife getan aber dann geht garnichts mehr
Ich jetzt mich auch verarscht fühle...

... ok, ab hier wieder korrektes Deutsch:

Also: Wieso setzt Du nicht das um, was Dir geraten wurde? So macht Deine Exception absolut keinen Sinn, da die Ebenen nicht stimmen. Zudem sagte ich ja, man soll den Block zu klein wie möglich halten. Im Tutorial / Doku wird das auch alles gut erklärt.

Zudem: Dein "Mittelteil" ist ja immer noch so häßlich.

Zu guter letzt: Wieso willst Du sockets benutzen und keine höhere Abstraktionsschicht, wie bereits mehrfach vorgeschlagen und nun zum dritten mal als Frage an Dich gestellt!

So langsam bin ich diese eingleisige und asoziale Kommunikationsform Deinerseits echt leid...

Verfasst: Montag 15. März 2010, 19:11
von coolerj
Ok weil ich mit mehreren das mache und die mit sokets am client arbeiten.
Bitte.
Problem bleibt

Verfasst: Montag 15. März 2010, 19:24
von Hyperion
Mal offtopic: Bist Du irgend wie Fremdsprachler? Wenn ja, sei Dir dein schwaches Deutsch verziehen...
coolerj hat geschrieben:Ok weil ich mit mehreren das mache und die mit sokets am client arbeiten.
Was andere mit Ihren Clients machen kann Dir ja egal sein - das entscheidene ist das Server-Protokoll! Also kannst Du das quasi nicht beeinflussen, sehe ich das richtig?

Was ist mit meinen anderen Fragen / Vorschlägen / Einwänden (Und denen der anderen)? Wieso gehst Du darauf nicht ein? Glaubst Du wirklich, so wird es in diesem Thread konstruktiv weitergehen?