so erhalten Sie eine socket-Nachricht mit einer leeren Daten?
habe ich einen socket-client und socket-server.
(der server ist in python, und ist synchroneous.)
manchmal sind die Kunden senden eine leere Zeichenfolge. bin ich verpflichtet, zu identifizieren, diese situation, und eine Antwort zurück.
mit diesem code, den der server hält nur auf warten, und die Kunden erhalten nichts zurück, es sei denn, er sendet etwas mroe "Fett" 😉
wie kann ich erfassen die leere Nachricht? ist es überhaupt möglich?
das ist mein server code:
import SocketServer
def multi_threaded_socket_server():
class MyRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
while True:
print 'waiting for client calls...'
received = self.request.recv( PACKET_SIZE )
(handle request... )
- Ist das TCP oder UDP?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie beschreiben ein multi-threaded-socket-server, es würde zu sein scheinen, TCP, in welchem Falle Ihre Anforderung nicht sinnvoll. Sie können nicht senden Sie eine leere Nachricht über TCP. Sie müssten eine überlagerte Protokoll für alles.
Wenn die leere Zeichenfolge bedeutet, dass 0 bytes an, die socket-library auf der client-Seite könnte es ignorieren, weil ein Paket mit 0 bytes Daten ist ein disconnect-Paket.
Vorausgesetzt, TCP, haben Sie zu entwerfen ein Protokoll, das anzeigt, wenn Sie erhalten haben, eine vollständige Nachricht. send() ist nicht garantiert, senden jedes byte (überprüfen Sie den Rückgabewert) und recv() garantiert nicht, Lesen Sie die Anzahl der angeforderten bytes.
Design ein Protokoll, enthält eine Möglichkeit, um zu bestimmen, eine vollständige Nachricht empfangen wurde. Gemeinsame Wege sind zu senden, die Größe der Nachricht, oder verwenden Sie eine spezielle Sequenz am Ende, der angibt, die Nachricht vollständig ist. Beachten Sie auch socket s sendall () - Methode wird alle bytes senden der Nachricht.
Beispiele:
Für das empfangen, Puffern recv() aufruft, bis eine vollständige Nachricht vorhanden ist.
Erhalten-Algorithmus (nicht-funktionierenden code):
*Vorausgesetzt Sie versenden Pakete mit python-socket-Modul mit TCP/IP ex:
Können Sie nicht verwenden, senden Sie eine leere Nachricht:
Strings gesendet, die über TCP/IP null sind beendet und so Aussehen:
So senden", " Ergebnis:
welche einen TCP-server interpretiert wird als ein trennen und die Prozedur dient nicht der Anfrage.
Senden Sie eine "leere Nachricht", dass die server umgehen, verwenden Sie so etwas wie:
sendet ein Paket, das aussieht wie:
und die Abwicklung würde folgendermaßen Aussehen:
Obwohl alle tcp-Pakete verwenden, 32-bit von Daten, unabhängig davon, ob es benutzt wird oder nicht, so senden einer einzelnen null-Zeichen ist nicht wirklich viel Leistung Segen.
""
wird nicht dazu führen, dass überhaupt nichts, geschweige denn etwas, das interpretiert werden, als eine Trennung. Alle TCP-Pakete, nicht "32-bit-Daten'. Antwort ist kompletter Unsinn.Als beantwortet zuvor recv() 0 zurückgeben bedeutet "trennen", so dass Sie nicht haben, eine 0-Länge Nachricht.
Jedoch, können Sie eine TCP-Nachricht, die scheint leer, wenn Sie nur betrachten es als einen string, wenn was eingegangen ist ein Paket, beginnend mit einem '\0' - Zeichen.
Können Sie behandeln diese Ecke Fall wie:
recv()
an trennen. Ein disconnect segment in TCP ist eine, die enthält ein FIN-bit. Es ist nicht unbedingt mit der Länge null.