Twisted - Событийно-ориентированный сетевой фреймворк

Twisted - это событийно-ориентированный сетевой фреймворк, написанный на Python и лицензированный по MIT License.

Проекты на Twisted могут поддерживать TCP, UDP, SSL/TLS, IP Multicast, Unix domain sockets, большое количество протоколов включая HTTP, XMPP, NNTP, IMAP, SSH, IRC, FTP и другие. Twisted основан на парадигме событийно-ориентированного программирования, и это значит, что пользователи Twisted пишут небольшие программы обратного вызова, которые вызываются фреймворком. Но работа Twisted не ограничивается только сетью. Этот фреймворк облегчает создание расширяемых с помощью плагинов программ, конструирование многосервисных программ, создание единой авторизации пользователей между сервисами и многое другое.

Пример простого бота для Jabber-сервера

   1 # Эти модули понадобятся.
   2 from twisted.words.protocols.jabber import client, jid, xmlstream
   3 from twisted.words.xish import domish
   4 from twisted.internet import reactor
   5 
   6 # Для JID-а используем специальный Twisted-класс
   7 me = jid.JID("greutly@swissjabber.ch/TwistedWords")
   8 
   9 # Так как бот -- это клиентское приложение, то и factory (см глоссарий) 
  10 # тоже будет клиентским. Библиотека twisted.words.protocols.jabber.client
  11 # предоставляет класс для создания factory Jabber-клиентов.
  12 factory = client.basicClientFactory(me, "password")
  13 
  14 # FSM полностью строится на callback-ах. Ждать нельзя. Поэтому писать 
  15 # что-то вроде "открыть сокет, подождать ответ, послать логин/пароль, 
  16 # подождать и т.д." тоже нельзя. Для того, чтобы выполнить какие-то
  17 # определенные действия после авторизации, необходимо создать callback:
  18 def authd(xmlstream):
  19    # создание XML элемента presence.
  20    presence = domish.Element(('jabber:client', 'presence'))
  21    presence.addElement('status').addContent('Online')
  22  
  23    # отправка в xmlstream. Обратите внимание, что это безопасная отправка,
  24    # так как эта функция вызывалась из главного цикла и в данный момент мы 
  25    # единственные, кто сейчас работает с потоком. Остальные, если есть, ждут.
  26    xmlstream.send(presence)
  27  
  28    # Установка обработчика на входящие XML-элементы message. Первый 
  29    # параметр -- это XPath
  30    xmlstream.addObserver('/message', gotMessage)
  31 
  32 # сам обработчик. параметр message -- XML-элемент
  33 # основная функция обработчика -- печатать то, что 
  34 # пришло.
  35 def gotMessage(message):
  36    # sorry for the str(), makes unicode happy
  37    print u"from: %s" % message["from"]
  38    for e in message.elements():
  39        if e.name == "body":
  40            print unicode(str(e))
  41            break
  42 
  43 # Теперь регистрация callback-а authd.
  44 factory.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, authd)
  45 
  46 # И последнее:
  47 # Создание главного реактора для клиентского TCP соединения
  48 reactor.connectTCP("swissjabber.ch", 5222, factory)
  49 # Запуск реактора
  50 reactor.run()

Пакеты/Network/Twisted (последним исправлял пользователь alafin 2010-05-26 15:54:47)