Следующей на очереди был 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()
Соединение происходит удачно, сервер получив от клиента сообщение отправляет его обратно, клиент в свою очередь получив сообщение, добавляет его на страницу.
Вроде всё удачно, но моих знаний не хватает. Если отрыть несколько клиентов, то о существование друг друга они не знаю и получают только свои же сообщения. От сюда возникает вопрос, каким образом можно написать класс который будет получать сообщения от всех клиентов сообщения и отсылать их всем. Каким образом в торнадо это реализуется.
P.S сокеты в браузерах заработали у меня в Chrome 7, Chromeum 9, Firefox 4.0b7, Opera 11. В Firefox 3.7 не проверял.