socket example all python sockets

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) .

  1. 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.

  2. Algunos datos vienen, el tamaño de los datos es más que recv_size .

  3. 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).