2010-12-10 19 views
12

En mi curiosidad en curso sobre websockets, estoy notando una tendencia:trenzado y WebSockets: Más allá del eco

El "hola mundo" del universo WebSocket, al menos por el momento, parece ser "eco" funcionalidad . Es decir, la aplicación demostrada es típicamente: "Envío algo, recibo algo".

Si bien demuestra que el protocolo es funcional, este ejemplo solo muestra el mismo tipo de comunicación que el ciclo de solicitud/respuesta tradicional.

Por ejemplo, la única demostración (en el lado del servidor) que puedo encontrar de twisted.web.websockets es la siguiente:

import sys 
from twisted.python import log 
from twisted.internet import reactor 
from twisted.web.static import File 
from twisted.web.websocket import WebSocketHandler, WebSocketSite 


class Echohandler(WebSocketHandler): 

    def frameReceived(self, frame): 
     log.msg("Received frame '%s'" % frame) 
     self.transport.write(frame + "\n") 


def main(): 
    log.startLogging(sys.stdout) 
    root = File(".") 
    site = WebSocketSite(root) 
    site.addHandler("/ws/echo", Echohandler) 
    reactor.listenTCP(8080, site) 
    reactor.run() 


if __name__ == "__main__": 
    main() 

¿Cómo puedo lugar estudiarán la capacidad de "empuje" aquí? es decir, ¿cómo puedo dejar el socket web abierto, y luego, en algún momento determinado por la ocurrencia de algún evento, enviar un mensaje a través del websocket, cuyo contenido también está influenciado por este evento?

(Los interesados ​​por esta cuestión también podría considerar como convincente a esta pregunta que pedí hace unos días: Making moves w/ websockets and python/django (/ twisted?))

+0

Dado que los websockets están desactivados en Firefox 4 http://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/, e incluso cuando terminen, es posible que no deseen trabajar en ellos. todos los navegadores, es probable que desee investigar una abstracción de nivel superior para su comunicación bidireccional con el navegador. Websockets son solo una forma de optimizar cosas como Athena http://divmod.org/trac/wiki/DivmodNevow/Athena y Orbited http://orbited.org/. – Glyph

+0

Por mala calidad que sea la especificación actual (y el soporte), ¿no son realmente websockets un remake completo de Comet (Athena, Orbited, etc.?). Por el momento, no estoy interesado en soluciones que funcionen en todos los navegadores; Solo quiero construir algo que funcione entre mí y otros miembros de un colectivo: tendremos control total sobre las condiciones de nuestro navegador y firewall. – jMyles

+1

No, no necesariamente. Athena es un completo sistema de mensajería de alto nivel, no solo transporta bytes. Y Orbited puede usar transportes múltiples, recurriendo a técnicas más primitivas/menos eficientes, ya que determina que las mejores no están disponibles. Esto es algo que desea incluso en su situación, porque si aparece algo * mejor * que websockets, probablemente quiera aprovecharlo sin tener que volver a escribir todo su código. – Glyph

Respuesta

0

Usando hendrix, me mostró cómo configurar una aplicación web en a talk at Django-NYC que utiliza WebSockets para empujar mensajes desde un servidor telnet a una página web.

9

Este es un ejemplo de un EchoHandler actualizada que en lugar de ser reactiva, ser proactivo.

class ChattyHandler(WebSocketHandler): 
    def connectionMade(self): 
     self.transport.write('oh hai\n') 
     self.saysomething() 

    def saysomething(self): 
     self.transport.write('still there?\n') 
     reactor.callLater(5, self.saysomething) 

Por desgracia, no parece websockets de https://github.com/rlotun/txWebSocket/ tener el método connectionMade(), y en su lugar lo único que se puede enganchar en la es __init__. por lo general, usted simplemente anularía connectionMade() si fuera un protocolo retorcido 'normal'.--Fixed en aguas arriba

+1

Esto plantea el argumento TypeError: __init __() después de que * debe ser una secuencia, no WebSocketTransport – jMyles

+1

TypeError corregido –

+4

Mantengo https: // github.com/rlotun/txWebSocket/y acabo de agregar un gancho 'connectionMade'. – rlotun

Cuestiones relacionadas