real - socket python 3
Python-convirtiendo sock.recv en una cadena (2)
Estoy cavando con python y redes.
while True:
data = sock.recv(10240)
Esto definitivamente está escuchando. Pero parece que necesita convertirse en una cadena de texto.
He visto a algunas personas que usan struct.unpack () , pero no estoy seguro exactamente cómo funciona. ¿Cuál es la forma de convertir?
En Python 2.7.xy antes, los data
ya son una cadena. En Python 3.x, los data
son un objeto de bytes. Para convertir bytes en cadena, use el método decode()
. decode()
requerirá un argumento de códec, como ''utf-8''.
Lo que obtienes de recv
es una cadena de bytes
:
Reciba datos del socket. El valor de retorno es un objeto de bytes que representa los datos recibidos.
En Python 3.x, para convertir una cadena de bytes
en una str
strings de texto Unicode, debe saber con qué conjunto de caracteres está codificada la cadena, para que pueda invocar decode
. Por ejemplo, si se trata de UTF-8:
stringdata = data.decode(''utf-8'')
(En Python 2.x, bytes
es lo mismo que str
, por lo que ya tiene una cadena. Pero si desea obtener una cadena de texto Unicode unicode
, es la misma que en 3.x.)
La razón por la que las personas a menudo usan struct
es porque los datos no son solo texto de 8 bits o Unicode, sino algún otro formato. Por ejemplo, puede enviar cada mensaje como una " cadena de texto ": una longitud (como una cadena de dígitos ASCII) seguida de un :
separador, luego bytes de length
de UTF-8, luego a ,
como b"3:Abc,"
. (Hay variantes en el formato, pero esta es la cadena de malla estándar de Bernstein.)
La razón por la que las personas usan cadenas de nets, u otras técnicas similares, es que necesita alguna forma de delimitar mensajes cuando usa TCP. Cada recv
podría darte la mitad de lo que el otro lado aprobó con send
, o podría dar tus 3 send
y parte del 4th. Por lo tanto, debe acumular un búfer de datos de recv
y luego extraer los mensajes. Y necesita una forma de saber cuándo termina un mensaje y comienza el siguiente. Si solo está enviando mensajes de texto sin ninguna nueva línea, puede usar líneas nuevas como delimitador. De lo contrario, tendrá que buscar otra cosa, tal vez netstrings, o usar /0
como delimitador, o usar líneas nuevas como delimitador, pero escapando líneas nuevas reales dentro de los datos, o usando algún formato estructurado auto delimitado como JSON.