Co wrócisz z recv
jest bytes
ciąg:
Odbieranie danych z gniazda. Wartością zwracaną jest obiekt bajtowy reprezentujący odebrane dane.
w Pythonie 3.x przekonwertować bytes
ciąg na ciąg Unicode tekst str
, trzeba wiedzieć, co zestaw znaków łańcuch jest zakodowany, więc można zadzwonić decode
. Na przykład, jeśli jest to UTF-8:
stringdata = data.decode('utf-8')
(w Pythonie 2.x, bytes
to samo, co str
, więc już dostał ciąg mam Ale jeśli chcesz uzyskać Unicode. tekst unicode
łańcuch, to jest taki sam jak w 3.x.)
powodem ludzie często używają struct
jest to, że dane te nie są tylko 8-bitowy lub tekst Unicode, ale jakiś inny format. Na przykład możesz wysłać każdą wiadomość jako "netstring": długość (jako ciąg cyfr ASCII), a następnie separator :
, następnie length
bajtów UTF-8, następnie ,
- taki jak b"3:Abc,"
. (Istnieją warianty w tym formacie, ale jest to standardowa sieć Bernsteina.)
Powodem, dla którego ludzie używają Netstrings lub innych podobnych technik, jest to, że potrzebujesz sposobu na rozgraniczenie wiadomości podczas korzystania z TCP. Każdy recv
może dać ci połowę tego, co przekazała druga strona z send
, lub może dać twoje 3 send
s i część czwartej. Tak więc, musisz zebrać bufor danych recv
, a następnie wyciągnąć z niego wiadomości. I potrzebujesz sposobu, aby powiedzieć, kiedy jedna wiadomość się kończy, a druga zaczyna. Jeśli wysyłasz zwykłe wiadomości tekstowe bez żadnych znaków nowej linii, możesz po prostu użyć znaków nowej linii jako ogranicznika. W przeciwnym razie będziesz musiał wymyślić coś innego - może netstring lub użycie \0
jako ogranicznika lub użycie linii nowej linii jako ogranicznika, ale unikanie rzeczywistych linii nowego ciągu danych lub użycie samozasilonego sformatowanego formatu, takiego jak JSON.
Jaką wersję Pythona używasz? Odpowiedź będzie inna dla 2.x versus 3.x. –
Wersja 3.3.0 Jak rozumiem, 2.x jest inny niż 3.x w niektórych funkcjach sieciowych – coffeemonitor
@ coffeemonitor: To nie wszystko, co różni się w funkcjach sieciowych - ale jest całkiem inny w funkcjach obsługi tekstu, który jest dlaczego Joshua D. Boyd zadał to pytanie. – abarnert