[Python-es] Chatear con una maquina!

Alvaro Manrique sanreikaj.foros en gmail.com
Mie Ago 15 23:48:51 CEST 2012


Buenas Tardes;

   Perdón si mi respuesta es off-topic pero si te interesa trabajar con
javascript y manejar paquetes json para una especie de chat, creo que debes
darle un vistazo a node.js, se que es una nueva tecnología pero estuve
viendo el manejo de sockets y con unas pocas líneas de código se implementa
lo que tu quieres.
El 15/08/2012 16:43, "Diego Uribe Gamez" <diego.uribe.gamez en gmail.com>
escribió:

> mmmm Disculpen que no me hice entender, voy a hablar a nivel de código y
> me voy a enfocar en el proyecto que mencione al principio, la razón de
> hacerlo de esta manera que la forma en la que funciona y el problema como
> la solución para mi proyecto esta en usar jason y Gevent, porque las
> consultas van a ser muchas y este sistema de combinado hace que la pagina
> chatee con la maquina sin gastar muchos recursos.
>
> Mi problema es en acondicionar este proyecto a la idea como tal de chatear
> con una maquina, me gusta es que tengo mucho del código a la mano y la idea
> es adaptarme.
>
> El código actual:
> -----------------------------------------------------------------------
> # Datos para la conexion al Socket y la IP que escucharemos
> host = '190.145.XXX.XXX'
> port = 33XX
> buf = 102400
> addr = (host, port)
> # Creamos el Socket - (INTERNET,UDP)
> UDPSock = socket(AF_INET,SOCK_DGRAM)
> UDPSock.bind(addr)
> # Bucle infinito (PROBLEMA)
> while 1:
>     # recibir data
>     data,addr = UDPSock.recvfrom(buf)
> -----------------------------------------------------------------------
> Nota: Resulta que yo estoy usando este código para capturar
> la información que me envían a mi ip y puerto, el problema es que estoy
> usando un bucle infinito para hacerlo y creo que esta mal, adicional
> necesitaba que apenas llegara algun dato poder mostrarselo al usuario en la
> pantalla, pensando en una solución me encontré con este proyecto y su demo
> que es un chat(en python, gevent, jason y javascript), donde para mi una
> solución es poder chatear con la maquina o mejor dicho es que apenas la
> maquina se comunique la idea es que el usuario pueda ver la información en
> tiempo real en la pagina web sin necesidad de recargar la pagina.
>
> En el código a continuación yo entiendo muchas cosas pero no estoy seguro
> de como adaptar mi código actual a la solución del problema.
>
> message_new() este se encarga de crear nuevos mensajes para los
> navegadores usando create_message y lo retorna con un json_response
>
> message_updates() dice que si no hay un mensaje en cache o que si el
> mensaje del navegador(cursor) es igual al ultimo mensaje toca esperar a un
> nuevo mensaje self.new_message_event.wait() para luego actualizar
>
> Código del Chat:
> -----------------------------------------------------------------------
> import uuid
> import simplejson
> from django.shortcuts import render_to_response
> from django.template.loader import render_to_string
> from django.http import HttpResponse
> from gevent.event import Event
> import settings
>
>
> class ChatRoom(object):
>     cache_size = 200
>
>     def __init__(self):
>         self.cache = []
>         self.new_message_event = Event()
>
>     def main(self, request):
>         if self.cache:
>             request.session['cursor'] = self.cache[-1]['id']
>         return render_to_response('index.html', {'MEDIA_URL':
> settings.MEDIA_URL, 'messages': self.cache})
>
>     def message_new(self, request):
>         name = request.META.get('REMOTE_ADDR') or 'Anonymous'
>         forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
>         if forwarded_for and name == '127.0.0.1':
>             name = forwarded_for
>         msg = create_message(name, request.POST['body'])
>         self.cache.append(msg)
>         if len(self.cache) > self.cache_size:
>             self.cache = self.cache[-self.cache_size:]
>         self.new_message_event.set()
>         self.new_message_event.clear()
>          return json_response(msg)
>
>     def message_updates(self, request):
>         cursor = request.session.get('cursor')
>         if not self.cache or cursor == self.cache[-1]['id']:
>             self.new_message_event.wait()
>         assert cursor != self.cache[-1]['id'], cursor
>         try:
>             for index, m in enumerate(self.cache):
>                 if m['id'] == cursor:
>                     return json_response({'messages': self.cache[index +
> 1:]})
>             return json_response({'messages': self.cache})
>         finally:
>             if self.cache:
>                 request.session['cursor'] = self.cache[-1]['id']
>             else:
>                 request.session.pop('cursor', None)
>
> room = ChatRoom()
> main = room.main
> message_new = room.message_new
> message_updates = room.message_updates
>
> def create_message(from_, body):
>     data = {'id': str(uuid.uuid4()), 'from': from_, 'body': body}
>     data['html'] = render_to_string('message.html', dictionary={'message':
> data})
>     return data
>
> def json_response(value, **kwargs):
>     kwargs.setdefault('content_type', 'text/javascript; charset=UTF-8')
>     return HttpResponse(simplejson.dumps(value), **kwargs)
> -----------------------------------------------------------------------
>
> Esto un poco por encima lo entiendo, lo que no sabría es como adaptar
> mi código actual a message_new?
>
> Espero haberme hecho entender y ver si pueden darme una idea.
>
> Gracias.
>
>
> El 14 de agosto de 2012 19:20, Olemis Lang <olemis en gmail.com> escribió:
>
>> On 8/14/12, Alexandro Colorado <jza en oooes.org> wrote:
>> > Si hay sistemas sobre jabber donde puedes crear un chat de grupo estilo
>> IRC
>> > donde tus servidores se conecten al irse en linea y esten reportando
>> cosas
>> > originadas de dbus o eventos de tu servidor web.
>> > Lo complicado seria la
>> > pre-programacion para que puedas responderles con comandos para
>> reiniciar,
>> > depurar, o resumir procesos.
>> >
>> > Estos proyecgtos probablemente ya existen es solo de seguir buscando, el
>> > detalle es saber que realmente quieres lograr.
>> >
>>
>> a ver a ver ... si están hablando d XMPP algo debería aparecer por aquí
>> http://xmpp.org/xmpp-protocols/xmpp-extensions/
>>
>> > 2012/8/14 Diego Uribe Gamez <diego.uribe.gamez en gmail.com>
>> >
>> >> Saludos, comunidad,
>> >>
>> >> Traigo este tema bastante interesante y es que quiero chatear con una
>> >> maquina,
>>
>> d hecho , si somos más estrictos en realidad *SIEMPRE* las máquinas
>> están chateando entre ellas , lo q de vez en cuando nos dejan ver unos
>> byte-citos ... ;)
>>
>> hay muchos ejemplos de bots implementados sobre XMPP . Está Google
>> guru , los ex-bots de Google Wave , ...
>>
>> [...]
>>
>> --
>> Regards,
>>
>> Olemis.
>>
>> Blog ES: http://simelo-es.blogspot.com/
>> Blog EN: http://simelo-en.blogspot.com/
>>
>> Featured article:
>> _______________________________________________
>> 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
> ------------------------------
>
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120815/1bd112e4/attachment.html>


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