2016-06-15 7 views
0

Sockets in ZMQ wird einfach an eine Schnittstelle gebunden und ist dann in der Lage Nachrichten direkt zu empfangen, wie folgt aus:ZMQ in Python: New Socket-Objekt für jede eingehende Verbindung

socket.bind("tcp://*:5555") 
message = socket.recv() 

Da mehrere Verbindungen Daten senden dieser Sockel gleichzeitig, , wie die verschiedenen Absender zu unterscheiden?

Auf der anderen Seite, mit regelmäßigen Steckdosen, werden eingehende Verbindungen zunächst angenommen, die eine neue Fassung, wie diese laicht: können leicht unterschieden werden

serversocket.bind((socket.gethostname(), 5555)) 
serversocket.listen() 
(clientsocket, address) = serversocket.accept() 

Hier werden die verschiedenen Absendern, da jeder durch empfangen wird eine andere Steckdose.

Was ist der beste Weg, um von der Nachrichten- und Warteschlangen-gepufferten Kommunikation von ZMQ zu profitieren, aber dennoch eine beliebige Anzahl unterscheidbarer Eins-zu-Eins-Verbindungen zu erstellen, sobald sie angefordert werden?

Antwort

0

Wie Sie die verschiedenen Clients unterscheiden können, hängt davon ab, welchen Socket-Typ Sie als "Server" verwenden. Die folgenden Erklärungen beantworten hoffentlich auch die zweite Frage.

REQ - Wird an den Client antworten, der die Anforderung gesendet wird, ein recv Anruf auf einer REQ Steckdose muss von einem send gefolgt werden, so können Sie die nächste Anforderung nicht bedienen, bis Sie das erste bearbeitet haben. Mehrere Anfragen von verschiedenen Clients werden jedoch in die Warteschlange gestellt.

ROUTER - Fügt einen Rahmen an die Nachricht Sie recv, die die Client-ID des Absenders enthält. Beim Senden einer Nachricht wird der erste Frame entfernt und verwendet, um zu identifizieren, auf welchen verbundenen Client er antworten soll. Sie sollten alle Frames bis einschließlich des leeren Delimiterframes speichern und sie Ihrer Antwortnachricht voranstellen, wenn Sie die Antwort senden. Im Gegensatz zu REQ gibt es keine Notwendigkeit, send vor einem anderen Anruf an recv gemeldet. Die Client-ID wird von ZeroMQ generiert, wenn nicht angegeben, aber wenn Sie 'Persistenz' möchten, können Sie die ID über setsockopt mit dem zmq.IDENTITY Flag setzen.

+0

Danke, das hat geholfen! Folgefragen: Kann das Schema, nach dem der 'ROUTER' die Client-ID wählt, konfiguriert werden? Wie persistent ist solch eine vom Server generierte Client-ID? Unter welchen Umständen ändert sich das? Kann man das kontrollieren/erkennen? –

+0

Die einzige Konfiguration, die mir bekannt ist, ist via 'setsockopt'. Jede automatisch generierte ID bleibt für die Dauer einer Verbindung gleich. Obwohl ich nicht sicher bin, ob dies die stille Wiederverbindung von Zeromq abdeckt, wenn die zugrunde liegende Netzwerkverbindung ausfällt. Normalerweise setze ich IDs über 'setsockopt', da es mir ermöglicht, später zu verbinden, zu senden, die Verbindung zu trennen und wieder herzustellen und Status-Updates von früheren Anfragen zu erhalten. – David