Non-blocking socket in Python?
Ist es bei mir so, oder kann ich nicht finden, ein gutes tutorial auf nicht-blockierende sockets in python?
Ich bin nicht sicher, wie genau die Arbeit der .recv
und die .send
in es. Nach der python docs (mein Verständnis zumindest) recv
'ed send
'ed Daten werden nur teilweise Daten. Also heißt das, ich muss irgendwie verketten der Daten während recv
und stellen Sie sicher, dass alle Daten sendet, die durch in send
. Wenn ja, wie? Ein Beispiel wäre sehr geschätzt werden.
- doughellmann.com/PyMOTW/select
- Sie wahrscheinlich wollen, um zu unterscheiden, send() und sendall(). tarekziade.wordpress.com/2011/07/12/firefox-sync-python Auch Sie wollen wahrscheinlich verwenden einige high-level-asynchrone IO-framework wie Eventlet: eventlet.net
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es eigentlich egal, wenn Ihre Steckdose ist im non-blocking-Modus ist oder nicht, empfangen/senden, arbeiten ziemlich viel dasselbe; der einzige Unterschied ist, dass nicht-blockierenden socket wirft 'Resource temporarily unavailable" - Fehler, anstatt zu warten, für Daten - /socket.
recv Methode gibt die Nummern der empfangenen bytes, die erzählt wird, ist weniger oder gleich der übergebenen bufsize. Wenn Sie möchten, erhalten Sie genau Größe bytes, die Sie tun sollten, etwas ähnliches wie den folgenden code:
Dies ist wichtig, daran zu erinnern, dass im blockierenden Modus, die Sie haben, genau dasselbe zu tun. (Die Anzahl der bytes übergeben application layer ist beispielsweise begrenzt durch recv buffer size in den OS.)
senden Methode gibt die Anzahl der gesendeten bytes an, die erzählt wird, ist weniger oder gleich der Länge der übergebenen Zeichenfolge. Wenn Sie sicherstellen möchten, dass die Nachricht vollständig gesendet wurde, sollten Sie etwas ähnliches wie den folgenden code:
Können Sie Socke.sendall direkt, sondern (entsprechend der Dokumentation) bei einem Fehler wird eine Ausnahme ausgelöst, und es gibt keine Möglichkeit zu bestimmen, wie viel Daten, falls vorhanden, wurde erfolgreich gesendet.
Den sockets in Python Folgen Sie den BSD-socket-API und Verhalten sich in ähnlicher Weise wie c-style-buchsen (der Unterschied ist, zum Beispiel, Sie werfen mit der Ausnahme, anstatt Fehler-code). Sie sollten gerne mit einer socket-tutorial auf dem web und die manpages.
recvall
war nicht so gut und Hinzugefügtif not d
zu handhaben geschlossene verbindungen.Halten bytes, die Sie senden möchten, in einem Puffer. (Eine Liste von byte-strings wäre am besten, da Sie nicht haben, zu verketten.) Verwenden Sie die
fcntl.fcntl
- Funktion den socket in den non-blocking Modus:Dann
select.select
wird Ihnen sagen, Wann es OK ist zu Lesen und zu schreiben in den socket. (Beim schreiben, wenn es nicht OK ist, wird Ihnen dieEAGAIN
Fehler im nicht-blockierenden Modus.) Wenn Sie schreiben, überprüfen Sie den Rückgabewert, um zu sehen, wie viele bytes wurden tatsächlich geschrieben. Beseitigen viele bytes aus dem Puffer. Wenn Sie die list-of-strings Ansatz, Sie müssen nur schreiben Sie die erste Zeichenfolge jedes mal.Wenn Sie Lesen, den leeren string, Ihren socket geschlossen hat.
mysocket.setblocking(0)
.