Подтвердить что ты не робот

Twisted and Websockets: Beyond Echo

В моем постоянном любопытстве о веб-сайтах я заметил тенденцию:

"мир привет" юниверса websocket, по крайней мере на данный момент, кажется "эхо" функциональностью. То есть, продемонстрированное приложение, как правило, "я что-то посылаю, я что-то получаю".

В то же время, демонстрируя, что протокол является функциональным, этот пример демонстрирует только тот же тип связи, что и традиционный цикл запроса/ответа.

Например, единственная демонстрация (на стороне сервера), которую я могу найти в twisted.web.websockets, следующая:

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

Как я могу вместо этого изучить возможность "push"? т.е. как я могу оставить веб-сокет открытым, а затем позже, в определенное время, определяемым появлением какого-либо события, отправить сообщение через websocket, на содержание которого также влияет это событие?

(Те, кого интересует этот вопрос, могут также считать неотложным этот вопрос, который я задал несколько дней назад: Создание ходов w/websockets и python/django (/twisted?))

4b9b3361

Ответ 1

Используя hendrix, я показал, как настроить веб-приложение в в Django-NYC, в котором используются веб-порты для передачи сообщений с сервера telnet на веб-страницу.

Ответ 2

Это пример обновленного EchoHandler, который будет вместо того, чтобы быть реактивным, быть активным.

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)

К сожалению, веб-узлы из https://github.com/rlotun/txWebSocket/, похоже, не имеют метода connectionMade(), и вместо этого единственное, что вы можете подключить это __init__. обычно вы просто переопределяете connectionMade(), если это был "нормальный" витой протокол. - исправлено в верхнем