Last active
August 29, 2015 13:57
-
-
Save icsaas/9614840 to your computer and use it in GitHub Desktop.
long polling in tornado
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import string | |
import time | |
import logging | |
from datetime import datetime | |
import tornado.httpserver | |
import tornado.ioloop | |
import tornado.options | |
import tornado.web | |
import tornado.httpclient | |
from tornado.options import define, options | |
define("port", default=8888, help="run on the given port", type=int) | |
online = [] | |
count = 0 | |
class MainHandler(tornado.web.RequestHandler): | |
def get(self): | |
self.user = self.get_argument("name", None) | |
self.render("templates/index.html", title="Online number testing", c_time=datetime.now(), user=self.user) | |
class LongPollingHandler(tornado.web.RequestHandler): | |
@tornado.web.asynchronous | |
def get(self): | |
global online, count | |
self.user = self.get_argument("name", None) | |
if self.user not in online: | |
logging.info("user : " + self.user) | |
online.append(self.user) | |
http = tornado.httpclient.AsyncHTTPClient() | |
appURL = self.request.protocol + "://" + self.request.host | |
http.fetch(appURL + "/internal-polling", self._on_finish) | |
'''push to the client''' | |
def _on_finish(self, response): | |
if self.request.connection.stream.closed(): | |
return | |
self.write("welcome %s, current online number(s) %s" % (self.user, response.body)) | |
self.finish() | |
''' | |
def on_connection_close(self): | |
TODO, testing | |
''' | |
class InternalPollingHandler(tornado.web.RequestHandler): | |
''' | |
The internal polling for the new online member which will be counted into | |
the global online list, and then asynchronously push the latest data to the connected client,keep in a long-polling status. | |
''' | |
def get(self): | |
global online, count | |
logging.info("count : " + str(count)) | |
logging.info("online : " + str(len(online))) | |
if count != len(online): | |
count += 1 | |
self.get() | |
else: | |
self.write(str(count)) | |
def main(): | |
tornado.options.parse_command_line() | |
settings = { | |
"static_path": os.path.join(os.path.dirname(__file__), "static"), | |
} | |
application = tornado.web.Application([ | |
(r"/", MainHandler), | |
(r"/long-polling", LongPollingHandler), | |
(r"/internal-polling", InternalPollingHandler), | |
], **settings | |
) | |
http_server = tornado.httpserver.HTTPServer(application) | |
http_server.listen(options.port) | |
tornado.ioloop.IOLoop.instance().start() | |
if __name__ == "__main__": | |
main() | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<head> | |
<title>{{ title }}</title> | |
<script type="text/javascript" language="JavaScript" src="{{ static_url("jquery-1.5.1.min.js")}}"></script> | |
<script type='text/javascript' language='JavaScript'> | |
function test(){ | |
window.setTimeout(function(){ | |
$.ajax({ | |
url : '/long-polling?name={{ user }}', | |
success : function(data){ | |
$("#num").text(data); | |
} | |
}); | |
test(); | |
}, 5000); | |
} | |
</script> | |
</head> | |
<body> | |
Current time is {{c_time}} | |
<br> | |
<input type="button" value="Test" onclick="test();"/> | |
<div id="num"></div> | |
</body> | |
</html> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment