Realtime Web №2 - TornadIO

В продолжение предыдущего поста про Web реального времени: socket.io oказался хорошим, а вот существующая серверная поддержка для питона под названием SocketTornad.IO - не очень. Кроме кучки существующих багов, похоже что проект умер. Да и внутри там еще та каша.

И в результате - приветствуем TornadIO. TornadIO - Comet библиотека для организации постоянной связи между браузером и сервером для быстрой передачи сообщений туда и обратно.

По сути, переписал заново SocketTornad.IO, исправил ошибки, добавил всяких вкусностей и так далее. Вот сегодня его добавили на главную страницу socket.io, чему я рад.

Под катом - немного информации что это такое и с чем это едят.

Socket.io - это клиентская библиотка, которая предоставляет единый интерфейс для связи с comet сервером используя один из поддерживаемых протоколов.

Протоколы поддерживаются такие:

1. Websocket
2. Flashsocket 
3. XHR multipart
4. XHR polling 
5. JSONp
6. HTMLFile (IE only)

socket.io достаточно умный что бы выбрать наиболее эффективный протокол из поддерживающихся на клиенте.  Если протокол по каким-то причинам не сработал (Flashsocket не смог достучаться, так как прокси или еще чего), то берет следующий протокол. В списке выше, протоколы указаны в порядке их эффективности.

Немного о каждом протоколе:

1. Websocket

- Обычные websocket’ы из коробки.
- Открывается одно соединение на прием и отправку данных.
- Proxy поддерживаются

2. Flashsocket

- Эмуляция websocket’ов через специальный флешовый скрипт. Используется https://github.com/gimite/web-socket-js
- Одно соединение на прием и отправку данных
- Proxy не поддерживается

К слову - web-socket-js еще та петрушка, которую можно очень хорошо соптимизировать, чем обещают заняться разработчики socket.io.

3. XHR multipart

- Один долгоиграющий GET запрос на прием данных с сервера
- По POST запросу на отправку данных на сервер с клиента
- Proxy поддерживается

4. XHR polling

- Куча GET запросов, которые висят до 20 секунд если нет данных, для чтения данных с сервера
- По POST запросу на отправку данных на сервер с клиента 

5. JSONp

- Аналогично XHR polling, но данные приходят с сервера как JS скрипт.

6. HTMLFile

- Хитрая штука, которая нечто среднее между XHR multipart и XHR polling и только для IE
- Одно соединение для приема данных
- По POST запросу на отправку данных

Теперь о TornadIO.

TornadIO - это библиотека для поддержки транспортов socket.io поверх торнадо. По сути, мимикрирует внешнее API websocket’ов (их поддержка в торнадо появилась достаточно давно), при этом поддерживает все транспортные протоколы socket.io.

По сути, пишем код 1 раз и пускай socket.io + TornadIO заботятся о транспортном уровне.

Как это выглядит с точки зрения кода. Напишем простой realtime чат.

Вот это наша серверная часть (инициализация опущена, только сама логика чата):

class ChatConnection(tornadio.SocketConnection):
    participants = set()

    def on_open(self, *args, **kwargs):
        # Register incoming connection
        self.participants.add(self)
        self.send("Welcome!")

    def on_message(self, message):
        # Broadcast incoming message
        for p in self.participants:
            p.send(message)

    def on_close(self):
        # Remove client
        self.participants.remove(self)

        # Broadcast that client left
        for p in self.participants:
            p.send("A user has left.")

Каждый клиент - это отдельный экземпляр класса ChatConnection. Появился новый клиент - мы его добавили в set, ушел - убрали. Прислал сообщение - разослали всем в чате.

Клиентская часть выглядит так: https://github.com/MrJoes/tornadio/blob/master/examples/chatroom/index.html

Все достаточно просто.

Взять библиотеку можно тут или на pypi.

Примеры можно посмотреть тут: https://github.com/MrJoes/tornadio/tree/master/examples

Надеюсь еще кому-то пригодится.

blog comments powered by Disqus