|
11 | 11 | The framework being used must support web sockets.
|
12 | 12 | """
|
13 | 13 |
|
| 14 | +import argparse |
14 | 15 | import io
|
15 | 16 | import json
|
16 | 17 | import mimetypes
|
17 | 18 | from pathlib import Path
|
| 19 | +import signal |
| 20 | +import socket |
18 | 21 |
|
19 | 22 | try:
|
20 | 23 | import tornado
|
@@ -238,13 +241,36 @@ def __init__(self, figure):
|
238 | 241 |
|
239 | 242 |
|
240 | 243 | if __name__ == "__main__":
|
| 244 | + parser = argparse.ArgumentParser() |
| 245 | + parser.add_argument('-p', '--port', type=int, default=8080, |
| 246 | + help='Port to listen on (0 for a random port).') |
| 247 | + args = parser.parse_args() |
| 248 | + |
241 | 249 | figure = create_figure()
|
242 | 250 | application = MyApplication(figure)
|
243 | 251 |
|
244 | 252 | http_server = tornado.httpserver.HTTPServer(application)
|
245 |
| - http_server.listen(8080) |
246 |
| - |
247 |
| - print("http://127.0.0.1:8080/") |
| 253 | + sockets = tornado.netutil.bind_sockets(args.port, '') |
| 254 | + http_server.add_sockets(sockets) |
| 255 | + |
| 256 | + for s in sockets: |
| 257 | + addr, port = s.getsockname()[:2] |
| 258 | + if s.family is socket.AF_INET6: |
| 259 | + addr = f'[{addr}]' |
| 260 | + print(f"Listening on http://{addr}:{port}/") |
248 | 261 | print("Press Ctrl+C to quit")
|
249 | 262 |
|
250 |
| - tornado.ioloop.IOLoop.instance().start() |
| 263 | + ioloop = tornado.ioloop.IOLoop.instance() |
| 264 | + |
| 265 | + def shutdown(): |
| 266 | + ioloop.stop() |
| 267 | + print("Server stopped") |
| 268 | + |
| 269 | + old_handler = signal.signal( |
| 270 | + signal.SIGINT, |
| 271 | + lambda sig, frame: ioloop.add_callback_from_signal(shutdown)) |
| 272 | + |
| 273 | + try: |
| 274 | + ioloop.start() |
| 275 | + finally: |
| 276 | + signal.signal(signal.SIGINT, old_handler) |
0 commit comments