Es beginnt mit dem select
Aufruf. Diese Funktion überwacht die Sockets und wartet auf etwas Bemerkenswertes. Bei Sockets in der ersten Liste bedeutet "bemerkenswert", dass der Socket Daten zum Lesen zur Verfügung hat.
rlist, wlist, xlist = select.select([listening_socket] + open_sockets, [], [])
Der Code jetzt iteriert durch die Liste der Steckdosen mit Daten zum Lesen bereit und wirkt auf die Art der Socket-Basis gehandhabt wird.
Verbindungsorientierte ("Listening") Sockets werden verwendet, um neue Verbindungen zu akzeptieren. Da es in rlist
ist, wissen wir, dass es etwas für uns zum "Lesen" hat. Im Zusammenhang mit einem Abhören von Sockets bedeutet dies, dass eine neue Verbindung empfangen wurde. So akzeptieren wir die Verbindung und speichern den neuen Socket in der Liste open_sockets
.
new_socket, addr = listening_socket.accept()
open_sockets.append(new_socket)
Wenn die Steckdose nicht listening_socket
ist, dann ist es eine Buchse, welche (oder wurde) zu einem entfernten Client verbunden ist. Und wieder, da es in rlist
ist, wissen wir, dass es etwas für uns zum "Lesen" hat. Im Zusammenhang mit Connected Sockets bedeutet dies entweder, dass Daten tatsächlich zum Lesen verfügbar sind oder dass der Socket geschlossen wurde.
So nennen wir recv
alle verfügbaren Daten zu erhalten,
else:
data = i.recv(1024)
und sehen, ob wir tatsächlich etwas gelesen habe. Wenn keine Daten verfügbar waren, muss die Verbindung geschlossen worden sein, also schließen wir das Socket-Objekt und entfernen es aus open_sockets
.
if data == "":
i.close()
open_sockets.remove(i)
print "Connection closed"
Wenn wir haben tatsächlich Daten erhalten, können wir es nur an den Client zurückschreiben und sie auf dem Bildschirm drucken.
else:
i.send(data)
print repr(data)
Der erste Aufruf von select
wird warten, bis eine Verbindung eingeht.Sie können durch die Aktualisierung der Code als
print "About to call select"
rlist, wlist, xlist = select.select([listening_socket] + open_sockets, [], [])
print "Returned from select"
Nach dem ersten Aufruf für sich selbst sehen, werden rlist
listening_socket
umfassen. Wir wissen das, weil open_sockets
leer ist, und wie select
aufgerufen wird, wird nicht zurückgegeben, bis etwas gelesen wird, um zu lesen. Wir akzeptieren also die neue Verbindung und fügen sie zu open_sockets
hinzu.
Wenn select
erneut aufgerufen wird, gibt es drei mögliche Ereignisse. Erstens, listening_socket
möglicherweise eine andere Verbindung erhalten haben. In diesem Fall wird wie zuvor verfahren: Wir akzeptieren die Verbindung und fügen sie zu open_sockets
hinzu.
Zweitens könnte die neue Verbindung Daten empfangen haben. Da select
in rlist
enthalten ist, wissen wir, dass Daten bereit sind, aus dem Socket "gelesen" zu werden (was bedeutet, dass die Daten zum Lesen bereit sind oder der Socket geschlossen wurde). i.recv
wird die neuen Daten zurückgeben.
Drittens könnte die neue Verbindung geschlossen worden sein. Da select
in rlist
enthalten ist, wissen wir, dass Daten bereit sind, aus dem Socket gelesen zu werden (mit der gleichen Bedeutung wie oben). Aber i.recv
wird "" zurückgeben, da der Socket keine neuen Daten hat. Wir wissen also, dass die Steckdose geschlossen wurde, und bereinigen Sie entsprechend.
Wenn keine Daten vom Client gesendet werden (und die Verbindung noch offen ist), wird select
sie nicht in rlist
einschließen. Die Schleife wird also nicht verarbeitet, und i.recv
wird nicht an diesem bestimmten Socket aufgerufen.
Be sicher, eine Antwort zu akzeptieren, wenn einige der zur Verfügung gestellten Antworten Ihre Frage beantwortet haben. Es ist eine nette Art, den Leuten zu danken, die zu dieser Seite beitragen. Wenn Ihre Frage nicht beantwortet wurde, können Sie jederzeit einen Kommentar abgeben. Vielen Dank! – GargantuChet