https://docs.python.org/ja/3/howto/sockets.html
Dies ist ein Memo, wenn ich das lese.
Da es sich beim Lesen um eine Gehirndeponie handelt, wird empfohlen, dass diejenigen, die nur den Inhalt wissen möchten, das Dokument direkt lesen.
python3.8.2
Warum die Dokumentation lesen?
――Ich möchte das Dokument hier lesen und die Funktionen kennen, die tatsächlich nützlich sind, ohne es zu wissen.
――Es ist ungefähr 8 Jahre her, seit ich angefangen habe, Python zu verwenden, aber ich mache es in einer Atmosphäre, daher gibt es noch einige Funktionen, die ich nicht kenne.
――Ich benutze gelegentlich flask ・ django und zmq, aber ich habe gelebt, während ich von der internen Socket-Programmierung weggeschaut habe.
»Wie auch immer, ich möchte wissen, was eine Steckdose tut.
Überblick
- Die allgemeine Socket-Programmierung, insbesondere INET STREAM (dh IPv4 TCP), wird kurz durch Schreiben in Python erläutert.
――Ich habe keine Ahnung, was Sie zu diesem Zeitpunkt sagen
- Weder die Socket-Programmierung noch das Schreiben in Python werden ausführlich erklärt.
Sie sollten in der Lage sein, genügend Informationen zu erhalten, um sie ohne Verlegenheit verwenden zu können
Und das
Memo
Geschichte
--Socket wurde von Berkeley als Teil von BSD Unix erfunden und wurde sehr beliebt
Socket erstellen
- Es gibt Sockets für die Client- und die Serverseite.
――Da dies auch bei zmq der Fall ist, scheint die Schnittstelle die Socket-Ebene zu kennen.
――So lesen Sie, während Sie sich mit zmq vorstellen
client side
client_socket.py
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("qiita.com", 80))
nur das. Einfach
server side
server_side.py
#Machen Sie einen Server-Socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((socket.gethostname(), 80))
serversocket.listen(5)
# serving
while True:
clientsocket, address = serversocket.accept()
# threaded server
ct = client_thread(clientsocket)
ct.run()
Es ist ein bisschen mehr, aber es ist ziemlich einfach.
- In der ersten Zeile lautet der Variablenname Server-Socket, aber was Sie tun, ist genau das gleiche wie Clientsocket.
- Ein Server-Socket ist eine Person, die einen Client-Socket erstellt, der mit dem Überwachungsport kommuniziert (= sendet), wenn eine Verbindung hergestellt wird ().
――Wenn Sie es schaffen, werden Sie weiter zuhören
- Im Kontext von Deskriptor gestern gelesen weist sich das Binden einer Funktion an ein Objekt beispielsweise immer dem ersten Standardargument der Funktion zu. War das
--Binden hier wurde auch als das gleiche "Binden" interpretiert
―― Mit anderen Worten, Sie haben zuerst einen anonymen Server-Socket erstellt und socket.gethostname () als Host registriert, auf den Sie hören möchten.
- In Analogie zum Deskriptorbeispiel scheint es etwas auf der Welt zu geben, das das Hörziel dynamisch anpasst, ohne es zu binden.
- Auch clientsocket.connect übergibt den Host und den Port, aber ich stelle mir vor, dass serversocket ihn an den primitiveren Namen übergeben soll, der hier standardmäßig verwendet wird.
Sockel Beispiel
――Ich erkläre mit einem konkreteren Beispiel
- Der auf der Serverseite generierte Client-Socket entspricht dem auf der Client-Seite gereinigten.
- Der oben erwähnte Verbindungsfluss von Client zu Server → Server generiert Client-Socket → Client-Sockets sprechen miteinander. Es handelt sich um ein einstufiges abstraktes Design, nicht um die Spezifikationen des Sockets selbst.
- Das Codebeispiel ist ein leicht verständliches Beispiel für das Senden und Empfangen von Nachrichten mit Socket.
- Sie müssen sich Sorgen machen, ob Sie alle Nachrichten gesendet haben oder ob sie sich noch im Netzwerkpuffer befinden.
――Der Rest ähnelt zmq?
――Es ist schwierig, mehrere Nachrichten zu empfangen, und die Unterbrechungen sind nicht offensichtlich
- Es werden verschiedene Lösungen und ihre Probleme gezeigt
――Es scheint eine gute Lösung zu sein, die Länge am Anfang zu senden, aber selbst wenn Sie die Datenlänge beispielsweise mit einer 5-stelligen Nummer angeben, ist es in einem Hochlastnetzwerk nicht immer möglich, 5 Zeichen gleichzeitig zu empfangen.
Binärdaten
- Für verschiedene Endianer ist eine Konvertierung erforderlich
――Wenn eine große Anzahl von Longs gesendet wird, ist 0 4 Byte für Long, aber 2 Byte für ASCII.
――Lass uns die Daten genau ansehen und eine Auswahl treffen
Trennen
- Beim Trennen ursprünglich "shutdown ()" und "close ()"
- Die Python-Bibliothek führt
shutdown (); close ();
nur mit close ()
aus
- Außerdem schließt Python automatisch, wenn die GC abgeschlossen ist.
――Aber wenn der Sockel unbeabsichtigt stirbt, kann der Gegner hängen bleiben, daher ist es besser, sich nicht darauf zu verlassen
Nicht blockierende Steckdose
- Nicht blockierend mit
socket.setblocking (0)
- Im Gegensatz zum Blockieren von Sockets kann das Senden, Empfangen, Verbinden und Akzeptieren ohne weitere Schritte erfolgen
- Option 1: Rückgabewert und Fehler behandeln → Scheint verrückt zu werden
--Option 2: Verwenden Sie select
- Wenn Sie eine Liste von Sockets an select.select übergeben, werden nur die lesbaren / beschreibbaren Sockets zurückgegeben, sodass Sie die oben genannten Verben mit ihnen verwenden können.
Implementierung
Ich habe mir die Implementierung kurz angesehen, weil es eine große Sache war
https://github.com/python/cpython/blob/3.8/Lib/socket.py#L213
- Wenn Sie es mit Syntax verwenden, scheint es Sie zum Schließen aufzurufen, wenn Sie den Kontext verlassen
- Bei Verwendung durch Menschen ist es besser, SocketIO oder create_server zu verwenden.
Impressionen
――Ich denke, es ist besser, andere als INET und STREAM zu betrachten, um tiefer zu verstehen.
――Ich werde es in Zukunft nicht direkt verwenden, aber mir wurde klar, dass zmq eine ziemlich gute Abstraktion ist.