Twisted y Websockets: Beyond Echo

En mi curiosidad por los websockets, estoy notando una tendencia:

El “hola mundo” del universo websocket, al menos en este momento, parece ser la funcionalidad “eco”. Es decir, la aplicación demostrada suele ser: “Envío algo, recibo algo”.

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

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 en cambio examinar la capacidad de “empujar” aquí? es decir, ¿cómo puedo dejar abierto el socket web 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?

(Aquellos interesados ​​en esta pregunta también pueden considerar convincente esta pregunta que hice hace unos días: hacer movimientos con websockets y python / django (/ twisted?) )

Este es un ejemplo de un EchoHandler actualizado que, en lugar de ser solo reactivo, 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) 

Desafortunadamente, los websockets de https://github.com/rlotun/txWebSocket/ no parecen tener el método connectionMade (), y en lugar de eso, lo único que puedes conectar es el __init__. por lo general, simplemente anularía connectionMade () si fuera un protocolo torcido “normal”. – Fijado en sentido ascendente

Usando hendrix , mostré cómo configurar una aplicación web en una charla en Django-NYC que usa websockets para enviar mensajes desde un servidor telnet a una página web.