python - example - ¿Cuándo regresa socket.recv(recv_size)?
select python socket (2)
De la prueba, llegué a la conclusión de que, en los siguientes tres casos, socket.recv(recv_size)
.
Después de que se cerró la conexión. Por ejemplo, el lado del cliente llamado socket.close () o cualquier error de socket ocurrió, devolvería una cadena vacía.
Algunos datos vienen, el tamaño de los datos es más que
recv_size
.- Algunos datos vienen, el tamaño de los datos es menor que
recv_size
y no hay más datos después de un tiempo corto (encontré que 0.1s funcionarían).
Más detalles sobre el n. ° 3:
#server.py
while True:
data = sock.recv(10)
print data, ''EOF''
#client1.py
sock.sendall("12345")
sock.sendall("a" * 50)
#client2.py
sock.sendall("12345")
time.sleep(0.1)
sock.sendall("a" * 50)
Cuando ejecuto client1.py
, los ecos de server.py
:
12345aaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaa EOF
Cuando ejecuto client2.py
, los ecos server.py
:
12345 EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
¿Son mis conclusiones correctas? ¿Dónde puedo ver la descripción oficial sobre el # 3?
Sí, tu conclusión es correcta. socket.recv
es una llamada de bloqueo.
socket.recv(1024)
leerá como mucho 1024 bytes, bloqueando si no hay datos esperando ser leídos. Si no lee todos los datos, no se bloqueará ninguna otra llamada a socket.recv
.
socket.recv
también terminará con una cadena vacía si la conexión está cerrada o si hay un error.
Si desea un socket que no sea de bloqueo, puede usar el módulo de selección (un poco más complicado que simplemente usar sockets) o puede usar socket.setblocking
.
Tuve problemas con socket.setblocking
en el pasado, pero no dude en probarlo si lo desea.
Tendrá el mismo comportamiento que la llamada recv libc subyacente. Consulte la página man para obtener una descripción oficial del comportamiento (o lea una descripción más general de la API de los sockets).