Soy nuevo en Python y actualmente tengo que escribir un socket python para ejecutarlo como un script que se comunica con un dispositivo a través de TCP/IP (una estación meteorológica).
El dispositivo actúa como el lado del servidor (escuchando por IP: PUERTO, aceptando conexión, recibiendo solicitud, transfiriendo datos).
Solo necesito enviar un mensaje, recibir la respuesta y luego apagar pacíficamente y bien y cerrar el socket. Python: socket no bloqueante o Asincronos E/S
try:
comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(1)
try:
comSocket.connect((''))
except socket.error, msg:
sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(2)
comSocket.send('\r')
comSocket.recv(128)
comSocket.send('\r')
comSocket.recv(128)
comSocket.send('\r\r')
comSocket.recv(128)
comSocket.send('1I\r\r3I\r\r4I\r\r13I\r\r5I\r\r8I\r\r7I\r\r9I\r\r')
rawData = comSocket.recv(512)
comSocket.shutdown(1)
comSocket.close()
El problema que estoy teniendo es:
El canal de comunicación es fiable, el dispositivo es lento. Por lo tanto, a veces la respuesta del dispositivo con un mensaje de longitud 0 (solo un ACK), mi código se congelará y esperará la respuesta para siempre.
Este fragmento de código contiene la parte que implica SOCKET, todo el código se ejecutará bajo CRON, por lo que la congelación no es un comportamiento deseable.
Mi pregunta es:
¿Cuál sería la mejor manera en Python para manejar ese comportamiento, por lo que el código no se congela y esperar para siempre, pero se tratará de pasar a la próxima emisión (o tal) .
Debería echar un vistazo a la biblioteca [Twisted] (http://twistedmatrix.com/) para Python. Es un marco para redes asíncronas que lo haría mucho más fácil. – Andrea
Si bien el uso de la biblioteca Twisted puede funcionar, toda una biblioteca para un mensaje parece un poco exagerada. Quizás necesite que CRON abra un subproceso con su comunicación de socket en un hilo separado. De esa forma evitarás el problema del bloqueo. – chisaipete
@Andrea ya que tengo una pregunta similar a la publicada. ¿Twisted no está diseñado para el lado del servidor? ¿Cómo modificarlo para usar en el lado del cliente? – Hangon