Soy nuevo haciendo uso de python en este momento tenemos en mente un proyecto que por el requerimiento sin duda lo tenemos que usar un poco así que mi prueba consistió en conectar python a un server de socket.io ya saben esa cosa que hace websockets para comunicación entre un navegador y un servidor de manera bidireccional.
Preparándonos, las primeras 2 líneas instalan herramientas que facilitan la instalación de paquetes, las siguientes 2 son librerías de desarrollo que se necesitan para que funcionen los sockets.
apt-get install python-setuptools apt-get install python-pip apt-get install python-dev apt-get install libevent-dev
Una vez instalado, hacemos la instalación de la librería (https://github.com/invisibleroads/socketIO-client) que es la que hace la conexión al websocket como si de un navegador cliente se tratara =)
easy_install -U socketIO-client
Lo primero será que creemos un servidor socket.io sencillo a manera de demostración:
var server = require('http').createServer(function( req , res ){
res.writeHead(200);
res.end('lo hicimos lo hicimos lo hicimos muy bien');
});
var io = require('socket.io').listen( server )
server.listen(8000);
io.sockets.on('connection', function (socket) {
socket.emit('response','Hola mundo')
socket.on('evento',function(data){
console.log( data );
});
});
Esto como podemos ver correrá un servidor de sockets en el puerto 8000, en cuanto detecte una conexión le enviará un evento acompañado de datos que son ”Hola mundo” y cuando detecte que el cliente le envia el evento llamado “evento” nos mostrará en la consola la información que nos hayan enviado a través del socket. Por el momento nuestro servidor ya esta listo! Ahora…
Revisando rápidamente la documentación nos encontramos múltiples ejemplos con python, así que procedemos a crear las pruebas, el código para conectarnos desde python al servidor recientemente creado es el siguiente:
from socketIO_client import SocketIO
def on_response(*args):
print args
socketIO.emit('evento', {'conectado': 'wii'})
socketIO = SocketIO('localhost', 8000 )
socketIO.on('response',on_response)
socketIO.wait()
Importamos la librería necesaria, definimos una función que recibirá datos desde el servidor, los mostrará y enviará un evento con datos.
Realizamos la conexión al localhost (Que se supone es el mismo servidor o incluso por IP si fuera distinto) así como el puerto que esta sirviendo los websockets.
Definimos que en cuanto se reciba el evento ‘response’ se ejecute la función que muestra los datos y dispara un evento al servidor con información.
Hacemos que el socket espere (Aún no termino de definir si es completamente correcto ya que la app python sigue ejecutándose hasta interrumpirla).
Y ahora…! Ya podemos ver que esta funcionando corremos el servidor (con node o nodemon da igual prefiero nodemon para desarrollo =P):
$ nodemon app.js 24 Mar 23:16:47 - [nodemon] v0.6.23 24 Mar 23:16:47 - [nodemon] watching: /desarrollo/node/testPython 24 Mar 23:16:47 - [nodemon] starting `node app.js` info: socket.io started
Ahora ejecutamos nuestra app de python el cual nos mostrará un hola mundo que fue enviado desde el servidor
$ python pruebas.py (u'Hola mundo',)
Como podemos observar en la consola de nodemon se observa que se realizó la conexión de un nuevo cliente!
debug: client authorized
info: handshake authorized PPuA7cVXOPanRplA-kh5
debug: setting request GET /socket.io/1/websocket/PPuA7cVXOPanRplA-kh5
debug: set heartbeat interval for client PPuA7cVXOPanRplA-kh5
debug: client authorized for
debug: websocket writing 1::
debug: websocket writing 5:::{"name":"response","args":["Hola mundo"]}
debug: got heartbeat packet
{ conectado: 'wi' }
Así mismo se ve que se envía el evento response a Python y la consola muestra datos enviados por el script de python.
Y eso es todo =) Prueba básica de python + nodejs + socket.io websockets
Realicé pruebas con websockets seguros pero tuve que hacer unas modificaciones a un huevito de python. Al intentar conexiones a WSS (Websockets Seguros) python se quejaba y me mandaba un error:
$ python pruebas.py
/usr/local/lib/python2.6/dist-packages/websocket_client-0.10.0-py2.6.egg/websocket.py:203: DeprecationWarning: socket.ssl() is deprecated. Use ssl.wrap_socket() instead. self.ssl = socket.ssl(sock) ^CUnhandled exception in thread started by Error in sys.excepthook: Original exception was:
Lo que hice fue editar el archivo en /usr/local/lib/python2.6/dist-packages/websocket_client-0.10.0-py2.6.egg/websocket.py
Agregamos a los imports la siguiente línea:
import ssl
Editamos la siguiente línea (Es 200 y cacho el número de línea):
self.ssl = socket.ssl(sock)
De manera que quede:
self.ssl = ssl.wrap_socket(sock)
Y ahora si estamos listos para conectar python con websockets seguros a un servidor de nodejs =) El servidor de websockets seguros con nodejs + socket.io es otra historia, ya tengo algo con eso =P en cuanto pueda les proporciono un ejemplo ñ.ñ