server schließt sich sobald ein client es tut

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Mohammed
User
Beiträge: 8
Registriert: Samstag 26. Februar 2011, 21:13

Edit:
ok, habs geändert siehe den code. Aber der Fehler kommt immernoch:

ich hab einen server, der sich selber schließt, sobald es ein Client tut :(

Es kommt bei der Server Seite so eine Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\Mohammed\Desktop\Arbeit\Python\Python selbst 2.6\der ungewöhnliche chat\server.py", line 25, in ?
    nachricht = sock.recv(1024)
error: (10054, 'Connection reset by peer')
Hab keine Ahnung warum das so ist.. :K Kan mir jemand helfen?

Hier kommt der Server

Code: Alles auswählen

import socket 
import select

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind(("", 50000)) 
server.listen(1)

clients = []



while True: 
    lesen, schreiben, oob = select.select([server] + clients, 
                                              [], [])

    for sock in lesen: 
        if sock is server: 
            client, addr = server.accept() 
            clients.append(client)
            b="+++ Client %s verbunden" % addr[0]
            for a in clients:
                a.send(b)

        else: 
                
            nachricht = sock.recv(1024) 
            ip = sock.getpeername()[0]
                
            if nachricht: 
                for d in clients:
                    if d is sock:
                        continue
                    e="[%s] %s" % (ip, nachricht)
                    d.send(e) 
            else:
                for f in clients:
                    g="+++ Verbindung zu %s beendet" % ip
                    f.send(g)
                sock.close() 
                clients.remove(sock)



for c in clients:
    c.close()
server.close()


So jetzt der Client

Code: Alles auswählen

import socket
import select
import thread

ip = "127.0.0.1"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((ip, 50000))


def empfangen():
    while True:
        lesen, schreiben, oob=select.select([s],[],[])
        if lesen:
            a=s.recv(1024)
            print (a)
        else:
            pass


thread.start_new_thread(empfangen,())


try: 
    while True:
        
        nachricht = raw_input("Nachricht: ") 
        s.send(nachricht)
        
finally:
    s.close()
Zuletzt geändert von Mohammed am Dienstag 15. März 2011, 18:10, insgesamt 1-mal geändert.
lg Mohammed
deets

Das ist alles ziemlich gurkig und schwer verstaendlich.

Es faengts schonmal damit an, das du das hier machst:

Code: Alles auswählen

try:
   v = etwas_das_daneben_gehen_kann()
finally:
   was_mit_v_machen(v)
Das ist ein komplett ueberfluessiges Konstrukt. Denn statt einen sichere Art der Fehlerbehandlung zu haben, packst du einfach zu dem urspurenglichen fehler (in deinem Fall irgendwas, das sock.getpeername() werfen kann) einen NameError oben drauf.

Als schnellen Fix wuerde ich das try/finally komplett loswerden. Es bringt dir nix.

Darueber hinaus denke ich fehlen dir noch ein paar Puzzleteile um zu verstehen, wie client-server-programme auf socket-Ebene arbeiten.

Edit

Erm, entweder habe ich jetzt mich voellig vertan, oder hast du vorher nur einen Ausschnitt des codes geposted? Wie dem auch sei, jetzt hast du ja select-statements drin. die Kritik am try/finally bleibt, ein funktionierendes Beispiel findest du nach wie vor hier:

http://code.activestate.com/recipes/531 ... ectselect/

Und da steht auch, was mit dem socket.error zu machen ist.
Antworten