[Python-es] Como conectar multiples clientes usando el motor sockjs-tornado

Juan M. Puertas soft.sirius en gmail.com
Dom Nov 18 00:46:15 CET 2012


Hola Diego:
Tu último código de ejemplo me sigue dando el mismo error. Como dice la
"ley de Murfi", "si algo funciona, no le toques", así que seguiré
apañándome con Sajax.
 ¡Suerte! :-)


El 17 de noviembre de 2012 18:17, Diego Uribe Gamez <
diego.uribe.gamez en gmail.com> escribió:

> Bueno, como era de esperarse esta parte fue fácil:
>
> Este simple formulario lo que hace es mandar un mensaje para que el
> servidor responda el mismo mensaje, de paso el servidor imprime en terminal
> el mensaje y cuando el usuario se conecta.
>
> 2) Comunicación doble vía entre el navegador y el servidor:
>
> servidor.py
>
> -----------------------------------------------------------------------------------------------
> # -*- coding: utf-8 -*-
> from sockjs.tornado import SockJSRouter, SockJSConnection
>
> from tornado import web, ioloop
>
> class ConnectionHandler(SockJSConnection):
>
>     def on_open(self, info):
>         print 'new connection'
>
>     def on_message(self, msg):
>         # Imprimir mensaje entrante en terminal
>         print str("Servidor recibe: %s" % msg)
>         # Cuando entra el servidor responde
>         self.send(u"Servidor responde: %s" % msg)
>
> if __name__ == "__main__":
>     onopen = SockJSRouter(ConnectionHandler, r"/websocket")
>
>     application = web.Application(onopen.urls)
>
>     application.listen(8888)
>     ioloop.IOLoop.instance().start()
>
>
>
> cliente.html
>
> -----------------------------------------------------------------------------------------------
>
> <!DOCTYPE html>
> <html>
>     <head>
>         <title>SockJS</title>
>     </head>
>     <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
>     <script>
>         // Abrir conección
>         con = new SockJS('http://localhost:8888/websocket');
>         // Recibir un mensaje del servidor
>         con.onmessage = function(evt){
>             x = document.createElement("p");
>             x.innerHTML = evt.data;
>             document.getElementById("msgbox").appendChild(x);
>         }
>         // Funcion para despachar el mensaje al servidor
>         function DispatchText(){
>             var userInput = document.getElementById("message").value;
>              document.getElementById("message").value = "";
>             x = document.createElement("p");
>             x.innerHTML = "Mensaje enviado: " + userInput;
>             document.getElementById("msgbox").appendChild(x);
>             con.send(userInput);
>         }
>     </script>
>     <body>
>         <p style="width: 800px">Usar formulario para comunicarse con el
> servidor.</p>
>         <div id="msgbox" style="font-size: 14pt; height: 500px; width:
> 800px; overflow: scroll; border: 1px solid black"></div>
>         <form id="comunicacion" onsubmit="DispatchText()"
> action="javascript:void(0);">
>             <input type="text" id="message" name="message"
> autocomplete="off" style="width:700px" />
>             <input type="submit" id="sub" name="sub" value="Enviar"
> style="width:90px" />
>         </form>
>     </body>
> </html>
>
>
> -----------------------------------------------------------------------------------------------
>
> Ahora viene la parte difícil del caso y es, crear clientes, identificar
> clientes, enviar un mensaje a muchos clientes y enviar un mensaje a un
> cliente especifico.
>
> Yo les comente de articulo que habla de esto:
> http://blog.y3xz.com/blog/2012/06/08/a-modern-python-stack-for-a-real-time-web-application/
>
> Aquí se hace referencia a las librerías brukva y
> tornado-redis, también hay un ejemplo.
>
> Yo la verdad no entiendo que hacen estas librerías específicamente, si me
> pueden ayudar a entender para continuar les agradecería.
>
> Como creen que es la forma mas correcta para continuar?
>
> Continua:
>
> 3) Actividad de usuarios
>
> Saludos y anímense a comentar.
>
>
> El 16 de noviembre de 2012 15:23, Diego Uribe Gamez <
> diego.uribe.gamez en gmail.com> escribió:
>
> Lo que pasa es que el servidor funciona como un router para tu dirección
>> web:
>> SockJSRouter(ConnectionHandler, r"/websocket")
>>
>> y esta remplaza la entrada de apache a tu carpeta *websocket*, entones
>> cuando intentas navegar a esta ruta ya de por si el servidor.py tiene
>> sobrescrita la carpeta, para probar coloca el server y el cliente uno junto
>> al otro en una ruta o carpeta diferente a la que tienes, puedes llamarla
>> html5 o algo así.
>>
>> Como comentaste el servidor esta bien probando lo como dijiste, no
>> lo pensé y por otra parte ya logre conectar el html:
>>
>> <!DOCTYPE html>
>> <html>
>>      <head>
>>         <title></title>
>>     </head>
>>     <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
>>         <script>
>>             conn = new SockJS('http://localhost:8888/websocket');
>>         </script>
>>     <body>
>>     </body>
>> </html>
>>
>> lo que paso es que mi servidor estaba abriendo ('http://' +
>> window.location.host + '/websocket') en localhost:8080 que es como
>> configure mi servidor local, entonces la variable de javascript estaba mal
>> configurada y no estaba abriendo el socket en la dirección correcta
>> localhost:8888, ya así lo hace y en terminal muestra que se dio la nueva
>> conexión.
>>
>> Lo que sigue es mandar mensajes desde el navegador al servidor
>> y viceversa  mas adelante miro esto pero ya tengo de donde trabajar, si
>> tengo adelantos les mando.
>>
>> Saludos.
>>
>>
>> El 16 de noviembre de 2012 13:28, Juan M. Puertas <soft.sirius en gmail.com>escribió:
>>
>>  Hola Diego. Hola Miguel.
>>>  He probado tu primer ejemplo, utilizando como servidor el "servidor.py"
>>> de tu mensaje. Como cliente, el html correspondiente.
>>>   "servidor.py" lo he puesto en una carpeta llamada www, y el cliente
>>> lo he puesto en la carpeta "www/websocket".
>>>  Estoy utilizando Ubuntu Mint Mate. Hago correr servidor.py, y luego,
>>> en el navegador de Firefox 16, en "http://localhost:8888/websocket". un
>>> mensaje en el navegador indica: "Welcome to SockJS!" así vemos que el
>>> servidor funciona bien.
>>>  Luego, intento navegar en "http://localhost:8888/websocket/cliente.html",
>>> pero obtengo: "*404: Not Found*". Y en consola: *WARNING:root:404 GET /*
>>> *websocket/cliente.html (127.0.0.1) 0.52ms*
>>>  ¿Por qué será?
>>>
>>>   Insisto; con Sajax consigo enviar y recibir partámetros, sean o no
>>> sean procedentes de un formulario.
>>>  En realidad, como comentaba hace unos días, este es el futuro que va a
>>> unificar los GUI y el lenguaje gráfico de Python y de todos los
>>> lenguajes: HTML5.
>>>
>>>  Saludos desde las cercanías de la Alhambra :-)
>>>
>>>
>>> El 16 de noviembre de 2012 12:32, Diego Uribe Gamez <
>>> diego.uribe.gamez en gmail.com> escribió:
>>>
>>> Bueno Juan, te comento que yo si tengo un ejemplo funcional, pero con
>>>> esto lo que quiero es estabilidad de alto nivel, y la idea con este correo
>>>> es poder colocar un codigo que funcione perfectamente para este propósito y
>>>> que le funcione a cualquiera que lo encuentre, este codigo esta enfocado
>>>> para que lo pueda adaptar a un MVC o a un MVT como es Django, o a cualquier
>>>> codigo que se tenga a la mano, pero igual que tu y como yo no encuentro
>>>> contenido en mi idioma, la mayoría de contenido esta en ingles y pues yo
>>>> como buen hispano me dirijo a la lista de correo que me corresponde
>>>> buscando completar esto con personas que tienen mas experiencia que yo.
>>>>
>>>> En principio es abrir una conexión, luego serán los mensajes para todos
>>>> y por ultimo mensajes individuales discriminando usuarios y entre usuarios,
>>>> no se trata solo de un chat, tambien se trata de actualizar contenido
>>>> dinamico directamente desde la escritura de la base de datos, como escribí
>>>> en el primer correo, lo que yo voy a hacer es que si me puedes ayudar a
>>>> echar andar este codigo, lo que yo haga mas adelante lo publicare aquí, de
>>>> la misma forma que si tu encuentras algo nos ayudaría con tus
>>>> publicaciones, la meta es una y el codigo tambien, si tienes alguna
>>>> pregunta de este y crees que se puede mejorar de otra forma, pues
>>>> hablemoslo y hagamos esto una realidad, pero el enfoque es este y este
>>>> codigo tambien, para que todos lo vean y a todos le sirva.
>>>>
>>>> Gracias por tu comentario, espero otros se animen a continuar con
>>>> nosotros, podríamos pasar a ser muchos.
>>>>
>>>> El jueves, 15 de noviembre de 2012, Juan M. Puertas escribió:
>>>>
>>>>   Hola Diego y a todo el mundo.
>>>>>  En este momento me hallo en la misma búsqueda que tú. No he
>>>>> conseguido que a lo largo y ancho de Google me funcione un sólo
>>>>> programa-ejemplo de Websockets, lo que puede ser normal para un
>>>>> python-aficionado como yo ;-)
>>>>>  De momento seguiré con la opción más fácil que he encontrado para
>>>>> estas cuestiones; Sajax, yo lo estoy utilizando en un simple CGI, y las
>>>>> pruebas que he hecho no están nada mal. Lo más pesado es la depuración del
>>>>> código, lo que he resuelto duplicándolo. Por una parte tengo el CGI en
>>>>> python, y por otra un programa copia del anterior con la salvedad de que en
>>>>> lugar de tomar los datos que tengo en el formulario CGI, ya los incorpora
>>>>> tal y como llegarían del citado formulario en HTML.
>>>>>  Estaré muy atento a tus progresos y a que exista alguien en este foro
>>>>> que ya lo haya conseguido.
>>>>>  Saludos :-)
>>>>>
>>>>>
>>>>>
>>>>> El 15 de noviembre de 2012 23:44, Diego Uribe Gamez <
>>>>> diego.uribe.gamez en gmail.com> escribió:
>>>>>
>>>>>> Hola, les comento: mas que un problema es un desarrollo y la idea es
>>>>>> lograr comunicar al servidor usando python con el navegador de forma
>>>>>> asícrona, lograr mandar un datos del servidor a muchos clientes, como a
>>>>>> un único cliente especifico según su necesidad y también de un cliente a
>>>>>> otro cliente como un chat uno a uno.
>>>>>>
>>>>>> Pues en mi camino a realizar este desarrollo
>>>>>> me encontré con tecnologías bastante buenas siempre inclinándome a python,
>>>>>> pero también esta el tema del navegador donde encontré otras tecnologías
>>>>>> en conclusión y después de tanto buscar me encontré con este articulo: A
>>>>>> Modern Python Stack for a Real-time Web Application<http://blog.y3xz.com/blog/2012/06/08/a-modern-python-stack-for-a-real-time-web-application/>
>>>>>>
>>>>>> Aquí el autor comento las diferentes tecnologías que encontró  muy
>>>>>> parecido a mi propia búsqueda y mostró donde y como iniciar este trabajo.
>>>>>>
>>>>>> Pero como mi ingles es un poco corto no logro hacer esto, es por eso
>>>>>> que acudo aquí para ver si se animan a documentarlo por este medio y me
>>>>>> ayudar a crear una app que para muchos es un tabu, un motor para una pagina
>>>>>> que le permita actualizar contenido en vivo y en directo para cualquier
>>>>>> persona en cualquier escenario.
>>>>>>
>>>>>> Instalar lo necesario:
>>>>>> pip install tornado
>>>>>> pip install sockjs-tornado
>>>>>>
>>>>>> 1) Conectarme al servidor
>>>>>> Aquí intento conectarme al servidor desde el navegador e imprimir en
>>>>>> terminal 'nueva conexión' sin resultado.
>>>>>>
>>>>>> servidor.py
>>>>>> -----------------------------------------------------
>>>>>>
>>>>>> # -*- coding: utf-8 -*-
>>>>>> from sockjs.tornado import SockJSRouter, SockJSConnection
>>>>>>
>>>>>> from tornado import web, ioloop
>>>>>>
>>>>>> class ConnectionHandler(SockJSConnection):
>>>>>>
>>>>>>     def on_open(self, info):
>>>>>>         print 'new connection'
>>>>>>
>>>>>> if __name__ == "__main__":
>>>>>>     onopen = SockJSRouter(ConnectionHandler, r"/websocket")
>>>>>>
>>>>>>     application = web.Application(onopen.urls)
>>>>>>
>>>>>>     application.listen(8888)
>>>>>>     ioloop.IOLoop.instance().start()
>>>>>>
>>>>>> inicio.html
>>>>>> -----------------------------------------------------
>>>>>>
>>>>>> <!DOCTYPE html>
>>>>>> <html>
>>>>>>     <head>
>>>>>>         <title></title>
>>>>>>     </head>
>>>>>>     <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
>>>>>>         <script>
>>>>>>             conn = new SockJS('http://' + window.location.host +
>>>>>> '/websocket');
>>>>>>         </script>
>>>>>>     <body>
>>>>>>     </body>
>>>>>> </html>
>>>>>>
>>>>>> La idea aquí es simplemente que cuando abra la nueva conexión desde
>>>>>> el navegador este me imprima en termina que se logro, sin resultado, saben
>>>>>> que me falta?
>>>>>>
>>>>>> Gracias.
>>>>>>
>>>>>> --
>>>>>>  *Diego Alonso Uribe Gamez*
>>>>>> ------------------------------
>>>>>>
>>>>>> *Desarrollador web*
>>>>>>
>>>>>> Twitter: @DiegoUG <http://www.twitter.com/DiegoUG>
>>>>>>
>>>>>> Google+: http://gplus.to/diegoug
>>>>>> ------------------------------
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Python-es mailing list
>>>>>> Python-es en python.org
>>>>>> http://mail.python.org/mailman/listinfo/python-es
>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Nota: Por problemas con el e-mail. Puede que recibas de nuevo este
>>>>> mensaje en un tiempo.*
>>>>>
>>>>
>>>>
>>>> --
>>>> iPad
>>>>
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> http://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>>
>>>
>>>
>>> --
>>> *Nota: Por problemas con el e-mail. Puede que recibas de nuevo este
>>> mensaje en un tiempo.*
>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> http://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>>
>>>
>>
>>
>> --
>>  *Diego Alonso Uribe Gamez*
>> ------------------------------
>>
>> *Desarrollador web*
>>
>> Twitter: @DiegoUG <http://www.twitter.com/DiegoUG>
>>
>> Google+: http://gplus.to/diegoug
>> ------------------------------
>>
>>
>>
>
>
> --
>  *Diego Alonso Uribe Gamez*
> ------------------------------
>
> *Desarrollador web*
>
> Twitter: @DiegoUG <http://www.twitter.com/DiegoUG>
>
> Google+: http://gplus.to/diegoug
> ------------------------------
>
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>


-- 
*Nota: Por problemas con el e-mail. Puede que recibas de nuevo este mensaje
en un tiempo.*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20121118/bf44e276/attachment.html>


Más información sobre la lista de distribución Python-es