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

Diego Uribe Gamez diego.uribe.gamez en gmail.com
Dom Nov 18 19:46:50 CET 2012


Hola Juan, algo debes estar haciendo mal, seria bueno que miraras bien como
lo estas haciendo, el código ya funciono, en estos momentos continuo y voy
a ver la creación de clientes.

Saludos


El 17 de noviembre de 2012 18:46, Juan M. Puertas
<soft.sirius en gmail.com>escribió:

> 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.*
>
> _______________________________________________
> 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
------------------------------
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20121118/227b1baa/attachment.html>


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