Python sockets, wie mit der client unerwartet geschlossen wird
Meine python socket server überwacht und dann eine Verbindung zu einem client, dann senden Sie eine unbestimmte Anzahl von strings von einem Benutzer. Der client kann dann schließen, oder verliert die Verbindung zum server.
Dies verursacht einen Fehler.
[Errno 10053] Eine bestehende Verbindung wurde abgebrochen, indem die software in Ihre host-Maschine.
oder
[Errno 10054] Eine vorhandene Verbindung wurde zwangsweise geschlossen durch remote-host -
Wie umgehe ich dieses event so, dass ich die Verbindung schließen und neu starten, mein server empfangsbereit für eine Verbindung?
Python-Server-Beispiel:
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 7001 # Arbitrary non-privileged port
s = None
def startListening():
print "starting to listen"
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data:
break
print data
message = ""
while not "quit" in message:
message = raw_input('Say Something : ')
conn.sendall(message)
#conn.send("I got that, over!")
conn.close()
print "connection closed"
while 1:
startListening()
python-client Beispiel:
# Echo client program
import socket
import sys
HOST = 'localhost' # The remote host
PORT = 7001 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.connect(sa)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
s.sendall("Please send me some strings")
data = ""
while ("quit" not in data):
data = s.recv(1024)
print 'Received', repr(data)
s.close()
Diesen Fehler zu reproduzieren, führen Sie den server in einem Eingabeaufforderungsfenster, und der client in einem zweiten, dann schließen Sie das client-Fenster.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen try: except: um die Daten senden und Daten empfangen, die in der server-Skript erscheint, um das problem zu mindern:
Einfach in der Nähe deiner Seite der Verbindung und bereit sein, zu akzeptieren, eine neue Verbindung wieder.
Der beste Weg, um diese zu bewältigen, ist die Trennung der Erstellung des server-Sockets und das akzeptieren/Lesen/schreiben-Schleife:
with
für context-management. (Es ist nicht erwähnt in der Dokumentation für diesocket
Modul oder verwendet werden, in jedem Beispiele, aber die überprüfung der Mitglieder dessocket.socket
es hat tatsächlich__enter__()
und__exit__()
und erscheint somit eine gültige context-manager, zumindest in Python 3.)with
?path
im write-Modus und automatisch schließen, nachdem der block gestartet vonwith
wird verlassen, indem entweder die erfolgreiche oder fehlgeschlagene Ausführung.__enter__()
/__exit__()
sind nicht aufgeführt insocket
Dokumentation, sondern existieren auch innerhalb des Quellcodes.with socket.socket(args) as s: # do stuff
und dann schließt es sich automatisch, wenn nicht schon geschlossen, wenn der block verlassen wird. hg.python.org/cpython/file/bb8b75c6bfdf/Lib/socket.py#l138Ich denke, wenn client wird unerwartet geschlossen, dass nach SIGPIPE Sie behandeln soll, die das signal