Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 18, 2010 23:47:24

yurtaev
От:
Зарегистрирован: 2009-11-17
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по Tornado + WebSocket

Решил изучить WebSocket и попробовать написать простой чатик для теста. Для Python поддержка вебсокетов реализована библиотекой http://bitbucket.org/rushman/tx-websockets/ для Twisted, есть презентация Кириллова Сергея с PyKyiv и видео http://pycamp.org.ua/presentation/2 но к сожалению библиотека не поддерживает последнею спецификацию протокола.
Следующей на очереди был Tornado, в последних версиях добавилась поддержка вебсокетов. Немного повозившись, получил более менее работающий пример.

# -*- coding:utf8 -*-
import os
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.websocket

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("index.html")

class WebSocket(tornado.websocket.WebSocketHandler):
def open(self):
print "WebSocket opened"

def on_message(self, message):
print self.request.remote_ip + " say: " + message
self.write_message(self.request.remote_ip + " => " + message)

def on_close(self):
print "WebSocket closed"

settings = {
"static_path": os.path.join(os.path.dirname(__file__), "static"),
"template_path": os.path.join(os.path.dirname(__file__), "templates")
}
application = tornado.web.Application([
(r"/websocket", WebSocket),
(r"/", MainHandler),
], **settings)

if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Архив с примером http://narod.ru/disk/983001/src.zip.html



Соединение происходит удачно, сервер получив от клиента сообщение отправляет его обратно, клиент в свою очередь получив сообщение, добавляет его на страницу.
Вроде всё удачно, но моих знаний не хватает. Если отрыть несколько клиентов, то о существование друг друга они не знаю и получают только свои же сообщения. От сюда возникает вопрос, каким образом можно написать класс который будет получать сообщения от всех клиентов сообщения и отсылать их всем. Каким образом в торнадо это реализуется.

P.S сокеты в браузерах заработали у меня в Chrome 7, Chromeum 9, Firefox 4.0b7, Opera 11. В Firefox 3.7 не проверял.



Офлайн

#2 Ноя. 19, 2010 08:10:43

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Вопрос по Tornado + WebSocket

Например так - http://thomas.pelletier.im/2010/08/websocket-tornado-redis/

Если Вы просто хотите познакомится с WS, то Redis оттуда можно в принципе выкинуть. Но для реальных проектов его лучше оставить, так как обычно серверы tornado запускают по несколько штук.



Офлайн

#3 Ноя. 19, 2010 14:40:47

yurtaev
От:
Зарегистрирован: 2009-11-17
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по Tornado + WebSocket

ziro
Например так - http://thomas.pelletier.im/2010/08/websocket-tornado-redis/

Если Вы просто хотите познакомится с WS, то Redis оттуда можно в принципе выкинуть. Но для реальных проектов его лучше оставить, так как обычно серверы tornado запускают по несколько штук.
Спасибо, то что нужно. Думал о создание списка со всеми соединениями, но решил что в торнадо это каким то своим образом делается.



Офлайн

#4 Ноя. 21, 2010 11:11:28

name23
От:
Зарегистрирован: 2010-08-18
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по Tornado + WebSocket

ziro
Например так - http://thomas.pelletier.im/2010/08/webs … ado-redis/
Там внизу есть комментарий:
Your solution seems incorrect. It is generally forbidden to call tornado functions from threads. It's a single-threaded server and using multiple threads can cause strange things to happen under high load. See:

http://groups.google.com/group/python-tornado/msg/a7385e3a2b3ef20d
Как с этим быть?



Офлайн

#5 Ноя. 22, 2010 11:44:45

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Вопрос по Tornado + WebSocket

name23
Как с этим быть?
Да очень просто - написать свой клиент для работы с redis поверх ioloop. Возможно уже есть опубликованный - не смотрел. За основу можно взять https://github.com/bitly/asyncmongo



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version