Twisted and Websockets: Beyond Echo
-
25-09-2019 - |
Domanda
Nella mia continua curiosità per i websocket, sto notando una tendenza:
Il "Hello World" dell'universo WebSocket, almeno al momento, sembra essere la funzionalità "eco". Cioè, l'applicazione dimostrata è in genere, "Invio qualcosa, ricevo qualcosa".
Mentre dimostra giustamente che il protocollo è funzionale, questo esempio dimostra effettivamente lo stesso tipo di comunicazione che il ciclo di richiesta / risposta tradizionale abilita.
Ad esempio, l'unica dimostrazione (sul lato server) che posso trovare di Twisted.web.websockets è la seguente:
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()
Come posso invece esaminare la capacità di "push" qui? vale a dire, come posso lasciare aperta la presa web e, poi, in qualche momento determinato dal verificarsi di qualche evento, inviare un messaggio tramite WebSocket, il cui contenuto è influenzato anche da questo evento?
(Coloro che sono interessati da questa domanda potrebbero anche considerare avvincente questa domanda che ho posto qualche giorno fa: Fare mosse con websocket e python / django ( / attorcigliato?))
Soluzione 2
Usando Hendrix, Ho mostrato come impostare un'app web in Un discorso a Django-nyc Ciò utilizza WebSocket per spingere i messaggi da un server Telnet a una pagina Web.
Altri suggerimenti
Questo è un esempio di un echohandler aggiornato che invece di essere reattivo, sarà proattivo.
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)
Sfortunatamente, websockets da https://github.com/rlotun/txwebsocket/ non sembra avere il metodo ConnectionMade (), e invece l'unica cosa in cui puoi collegare è il __dentro__. Di solito si limita a sovrascrivere ConnectionMade () se si trattasse di un protocollo intrecciato "normale". --Fissata in upstream