SockJS-tornado is a Python server side counterpart of SockJS-client browser library running on top of Tornado framework.
Simplified echo SockJS server could look more or less like::
from tornado import web, ioloop
from sockjs.tornado import SockJSRouter, SockJSConnection
class EchoConnection(SockJSConnection):
def on_message(self, msg):
self.send(msg)
if __name__ == '__main__':
EchoRouter = SockJSRouter(EchoConnection, '/echo')
app = web.Application(EchoRouter.urls)
app.listen(9999)
ioloop.IOLoop.instance().start()
(Take look at examples for a complete version).
Subscribe to SockJS mailing list for discussions and support.
SockJS provides slightly different API than tornado.websocket. Main differences are:
- Depending on transport, actual client connection might or might not be there. So, there is no self.request and other tornado.web.RequestHandler properties.
- Changed open callback name to on_open to be more consistent with other callbacks.
- Instead of write_message, all messages are sent using send method. Just in case, send in tornado.web.RequestHandler sends raw data over the connection, without encoding it.
- There is handy broadcast function, which accepts list (or iterator) of clients and message to send.
You can pass various settings to the SockJSRouter, in a dictionary::
MyRouter = SockJSRouter(MyConnection, '/my', dict(disabled_transports=['websocket']))
Following options are supported:
*Name* | *Description* | *Default Value* |
session_check_interval | How often sessions are verified, in seconds. Lower the value, more resources sockjs-tornado will use to drop expired sessions, but will be more precise. | 1 |
disconnect_delay | How long does it takes to consider session dead, in seconds. | 5 |
heartbeat_delay | How often sockjs-tornado should send heartbeats to the client, in seconds. | 25 |
disabled_transports | List of disabled transports. Possible values are: 'websocket', 'xhr', 'xhr_streaming', 'jsonp', 'eventsource' and 'htmlfile' | [] |
sockjs_url | Location of the sockjs client script. By default points to the SockJS CDN. | http://cdn.sockjs.org/sockjs-0.1.2.min.js |
sockjs-tornado properly works behind haproxy and it is recommended deployment approach.
Sample configuration file can be found here.
If your log is full of "WARNING: Connection closed by the client", pass no_keep_alive as True to HTTPServer constructor::
HTTPServer(app, no_keep_alive=True).listen(port)
or::
app.listen(port, no_keep_alive=True)