2010-12-10 21 views
12

In meiner laufenden Neugier WebSockets, ich bemerken einen Trend:Verdreht und Websockets: Beyond Echo

Die „Hallo Welt“ des websocket Universum, zumindest im Moment, so scheint „Echo“ Funktionalität zu sein . Das heißt, die gezeigte Anwendung ist typischerweise "Ich sende etwas, ich bekomme etwas".

Dieses Beispiel demonstriert zwar einwandfrei, dass das Protokoll funktionsfähig ist, zeigt jedoch nur die gleiche Art von Kommunikation, die der traditionelle Anfrage/Antwort-Zyklus ermöglicht.

Zum Beispiel die einzige Demonstration (auf der Server-Seite), dass ich von twisted.web.websockets finden kann, ist die folgende:

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() 

Wie kann ich hier „Push“ -Funktion statt untersuchen? dh wie kann ich den Web-Socket offen lassen, und später, irgendwann durch das Auftreten eines Ereignisses bestimmt, eine Nachricht durch den Websocket senden, dessen Inhalt ebenfalls von diesem Ereignis beeinflusst wird?

(Interessenten durch diese Frage könnte auch als zwingende diese Frage betrachten, die ich vor ein paar Tagen gefragt: Making moves w/ websockets and python/django (/ twisted?))

+0

Vorausgesetzt, dass Websockets in Firefox 4 deaktiviert sind http://hacks.mozilla.org/2010/12/webessockets-disabled-in-firefox-4/, und selbst wenn sie fertig sind, möchten sie möglicherweise nicht arbeiten allen Browsern möchten Sie wahrscheinlich eine höhere Abstraktion für Ihre bidirektionale Browserkommunikation untersuchen. Websockets sind nur eine Möglichkeit, Dinge wie Athena http://divmod.org/trac/wiki/DivmodNevow/Athena und Orbited http://orbited.org/ zu optimieren. – Glyph

+0

So schäbig wie die aktuelle Spezifikation (und Unterstützung) ist, sind WebSockets eigentlich keine komplette Neuauflage von Comet (Athena, Orbited, etc.?). Im Moment bin ich nicht an Lösungen interessiert, die in allen Browsern funktionieren; Ich möchte nur etwas bauen, das zwischen mir und anderen Mitgliedern eines Kollektivs funktioniert - wir haben die volle Kontrolle über unsere Browser- und Firewall-Bedingungen. – jMyles

+1

Nein, nicht unbedingt. Athena ist ein komplettes High-Level-Messaging-System, es transportiert nicht nur Bytes. Und Orbited kann mehrere Transporte verwenden, indem es auf primitivere/weniger effiziente Techniken zurückgreift, da es feststellt, dass die besseren nicht verfügbar sind. Das ist etwas, was Sie auch in Ihrer Situation wollen, denn wenn etwas * besser * als Websockets kommt, möchten Sie wahrscheinlich davon profitieren, ohne all Ihren Code neu schreiben zu müssen. – Glyph

Antwort

0

Mit hendrix habe ich gezeigt, wie man einen Web-App in a talk at Django-NYC einrichten, die WebSockets verwendet, um Nachrichten an eine Webseite von einem Telnet-Server zu schieben.

9

Dies ist ein Beispiel einer aktualisierten EchoHandler, dass anstelle von wird nur reaktiv, proaktiv sein.

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) 

Leider WebSockets von https://github.com/rlotun/txWebSocket/ scheint nicht das connectionMade() -Methode zu haben, und stattdessen das einzige, was Sie in Haken kann, ist die __init__. Normalerweise würde man connectionMade() einfach überschreiben, wenn es ein "normales" verdrehtes Protokoll wäre.--Fixed in Upstream

+1

Dies löst TypeError: __init __() Argument nach * muss eine Sequenz sein, nicht WebSocketTransport – jMyles

+1

TypeError behoben –

+4

Ich pflege https: // github.com/rlotun/txWebSocket/und ich habe gerade einen 'connectionMade'-Hook hinzugefügt. – rlotun