Форум сайта python.su
Добрый вечер!
Есть веб-сервис и desktop-приложение к нему на wxPython. Пользователь авторизуется через GUI и может работать с приложением. Но нужно сделать механизм отправки моментальных уведомлений с сервера клиенту. Как я понимаю, обычный long-polling. Сайт работает на django, но как я понимаю это не имеет значения, т. к. long-polling сервер будет работать на другой технологии.
Как я сейчас вижу работу этого механизма:
1. На сайте работает django, отправляет уведомления в rabbitmq, например.
2. Десктоп-клиент отправляет запрос на сервер, сервер не отдает ему ответа пока не прийдет нового уведомления.
3. Сервер получает новое сообщение из rabbitmq и закрывает соединение с клиентом.
4. Клиент выводит пользователю уведомление и снова обращается к серверу.
Вот хотел у вас посоветоваться, может кто такое делал - на каких технологиях лучше сделать? Все пишут по разному: gevent, tornado, socket.io, etc.
И как это лучше сделать на клиенте кроссплатформенно?
Заранее большое спасибо за помощь!
Офлайн
Нашел пример для gevent:
import asyncore, socket class HTTPClient(asyncore.dispatcher): def __init__(self, host, path): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.connect( (host, 80) ) self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path def handle_connect(self): pass def handle_close(self): self.close() def handle_read(self): print self.recv(8192) def writable(self): return (len(self.buffer) > 0) def handle_write(self): sent = self.send(self.buffer) self.buffer = self.buffer[sent:] client = HTTPClient('www.python.org', '/') asyncore.loop()
Офлайн
Планируется довольно большое количество одновременно подключенных клиентов.
Офлайн
Я делал так:
на сервере создаётся пул пользовтельских сессий в которых накапливаются события. Если клиент обратился на сервер и события есть, то клиент получает ответ сразу и соединение закрывается. Если событий в очереди нет, то соединение висит, ждёт.
Но: я это делал для js-клиента. У Вас клиент питоновский, может быть можно обратиться на некий серверный порт и слушать оттуда постоянно?
Офлайн