Найти - Пользователи
Полная версия: Вопрос по Tornado + WebSocket
Начало » Network » Вопрос по Tornado + WebSocket
1
yurtaev
Решил изучить 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 не проверял.
ziro
Например так - http://thomas.pelletier.im/2010/08/websocket-tornado-redis/

Если Вы просто хотите познакомится с WS, то Redis оттуда можно в принципе выкинуть. Но для реальных проектов его лучше оставить, так как обычно серверы tornado запускают по несколько штук.
yurtaev
ziro
Например так - http://thomas.pelletier.im/2010/08/websocket-tornado-redis/

Если Вы просто хотите познакомится с WS, то Redis оттуда можно в принципе выкинуть. Но для реальных проектов его лучше оставить, так как обычно серверы tornado запускают по несколько штук.
Спасибо, то что нужно. Думал о создание списка со всеми соединениями, но решил что в торнадо это каким то своим образом делается.
name23
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
Как с этим быть?
ziro
name23
Как с этим быть?
Да очень просто - написать свой клиент для работы с redis поверх ioloop. Возможно уже есть опубликованный - не смотрел. За основу можно взять https://github.com/bitly/asyncmongo
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB