Ich habe ein Python-Programm mit vielen Threads. Ich dachte daran, einen Socket zu erstellen, ihn an localhost zu binden und die Threads an diesem zentralen Ort lesen / schreiben zu lassen. Ich möchte jedoch nicht, dass dieser Socket für den Rest des Netzwerks offen bleibt, nur Verbindungen von 127.0.0.1
sollten akzeptiert werden. Wie würde ich das (in Python) machen? Und ist das ein passendes Design? Oder gibt es etwas Elegantes?
Wenn Sie einen mit socket.socket()
erstellten Socket verwenden, können Sie bind()
verwenden vor dem Hören:
Die Verwendung der Adresse 127.0.0.1
zeigt an, dass der Socket nur an die lokale Schnittstelle gebunden sein sollte.
Zeigt einige Socket-Beispiele. Dieser Leckerbissen ist für dich interessant, denke ich
Wir haben socket.gethostname () verwendet, damit der Socket für die Außenwelt sichtbar ist. Wenn wir s.bind (('', 80)) oder s.bind (('localhost', 80)) oder s.bind (('127.0.0.1', 80)) benutzt hätten, hätten wir immer noch einen "Server" "Buchse, aber eine, die nur innerhalb der gleichen Maschine sichtbar war.
Ich denke, da ist Ihre Antwort ( siehe unten zur Korrektur )
Zur Gültigkeit dieser Methode für die Thread-Kommunikation. Ich bin mir nicht sicher, wie gut das mehrere Threads behandelt und lesen / schreiben
BEARBEITEN
Es scheint ein Python-Rezept zu geben, das unten verlinkt ist und eine Kommunikation zwischen den Threads durchführt
Viel Spaß!
BEARBEITEN
Der Artikel ist falsch und wie angegeben " s.bind (('', 80)) bindet an INADDR_ANY "
Wenn Sie auf einem UNIX-basierten System arbeiten, sollten Sie UNIX Domain Sockets anstelle von Internet verwenden Steckdosen. Ich denke, etwas wie das Folgende sollte funktionieren:
%Vor%Sie können stattdessen das Warteschlangenmodul aus der Standardbibliothek verwenden. Es wurde speziell entwickelt, um die Kommunikation zwischen Threads zu erleichtern. Ein Zitat aus der Dokumentation:
Das Warteschlangenmodul implementiert Multi-Producer- und Multi-Consumer-Warteschlangen. Es ist besonders nützlich in der Thread-Programmierung, wenn Informationen sicher zwischen mehreren Threads ausgetauscht werden müssen. Die Queue-Klasse in diesem Modul implementiert alle erforderlichen Sperrsemantiken. Dies hängt von der Verfügbarkeit der Thread-Unterstützung in Python ab. siehe das Threading-Modul.
notionOn TCP / IP-Netzwerke 127.0.0.0/8 ist ein nicht routbares Netzwerk. Sie sollten daher kein IP-Datagramm für eine geroutete Infrastruktur an 127.0.0.1 senden können. Der Router wird nur das Datagramm verwerfen. Es ist jedoch möglich, Datagramme mit einer Zieladresse von 127.0.0.1 zu konstruieren und zu senden, sodass ein Host im selben Netzwerk (IP-Netzwerk) wie Ihr Host das Datagramm möglicherweise an den TCP / IP-Stack Ihres Hosts senden kann. Dies ist, wo Ihre lokale Feuerstelle ins Spiel kommt. Ihre lokale (Host-) Firewall sollte eine Regel haben, die IP-Datagramme, die für 127.0.0.0/8 bestimmt sind, verwirft, die an eine andere Schnittstelle als lo0 (oder die entsprechende Loopback-Schnittstelle) kommen. Wenn Ihr Host entweder 1) solche Firewall-Regeln installiert hat oder 2) in seinem eigenen Netzwerk existiert (oder mit nur vollständig vertrauenswürdigen Hosts geteilt wird) und hinter einem gut konfigurierten Router, können Sie sicher einfach an 127.0.0.1 binden und ziemlich sicher sein Datagramme, die Sie auf dem Socket empfangen, stammen vom lokalen Computer. Die vorherigen Antworten beziehen sich auf das Öffnen und Binden an 127.0.0.1.
Tags und Links python client-server