ad3w
Фев. 2, 2013 20:05:19
Добрый вечер!
Есть веб-сервис и desktop-приложение к нему на wxPython. Пользователь авторизуется через GUI и может работать с приложением. Но нужно сделать механизм отправки моментальных уведомлений с сервера клиенту. Как я понимаю, обычный long-polling. Сайт работает на django, но как я понимаю это не имеет значения, т. к. long-polling сервер будет работать на другой технологии.
Как я сейчас вижу работу этого механизма:
1. На сайте работает django, отправляет уведомления в rabbitmq, например.
2. Десктоп-клиент отправляет запрос на сервер, сервер не отдает ему ответа пока не прийдет нового уведомления.
3. Сервер получает новое сообщение из rabbitmq и закрывает соединение с клиентом.
4. Клиент выводит пользователю уведомление и снова обращается к серверу.
Вот хотел у вас посоветоваться, может кто такое делал - на каких технологиях лучше сделать? Все пишут по разному: gevent, tornado, socket.io, etc.
И как это лучше сделать на клиенте кроссплатформенно?
Заранее большое спасибо за помощь!
ad3w
Фев. 2, 2013 20:40:21
Нашел пример для 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()
+ скриптик, который в redis добавляет сообщения и клиент на asyncore. Насколько надежна такая связка?
ad3w
Фев. 2, 2013 20:40:52
Планируется довольно большое количество одновременно подключенных клиентов.
axe
Фев. 12, 2013 13:05:38
Я делал так:
на сервере создаётся пул пользовтельских сессий в которых накапливаются события. Если клиент обратился на сервер и события есть, то клиент получает ответ сразу и соединение закрывается. Если событий в очереди нет, то соединение висит, ждёт.
Но: я это делал для js-клиента. У Вас клиент питоновский, может быть можно обратиться на некий серверный порт и слушать оттуда постоянно?