Торнадо - WebSocketClientConnection - Как отлавливать и обрабатывать сбои соединения?

Я Торнадо, а также новичок в Websocket. Есть много ресурсов, как реализовать серверное приложение websocket с Tornado. Однако я не нашел полного примера, который содержит клиентское приложение websocket, созданное поверх Tornado.


Серверное приложение (server.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import tornado.web
import tornado.websocket
import tornado.ioloop
import tornado.options

from tornado.options import define, options

define("port", default=3000, help="run on the given port", type=int)


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [(r"/", MainHandler)]
        settings = dict(debug=True)
        tornado.web.Application.__init__(self, handlers, **settings)


class MainHandler(tornado.websocket.WebSocketHandler):
    def check_origin(self, origin):
        return True

    def open(self):
        logging.info("A client connected.")

    def on_close(self):
        logging.info("A device disconnected")


def main():
    tornado.options.parse_command_line()
    app = Application()
    app.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()


if __name__ == "__main__":
    main()

Клиентское приложение (client.py):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tornado.ioloop import IOLoop
from tornado.websocket import websocket_connect


if __name__ == "__main__":
    ws = websocket_connect("ws://localhost:3000")
    IOLoop.instance().start()

Проблемы и вопросы

У меня нет проблем с серверным приложением. Тем не менее, я не могу сказать то же самое для клиентского приложения. Зачем?

  1. Если сервер не работает, клиентское приложение не реагирует. Это не говорит: "Эй, сервер не работает, приятель". Я пишу свой собственный класс WebSocketClientConnection (унаследованный оригиналом), а также функцию websocket_connect (та же функция, но эта использует мой класс WebSocketClientConnection). Я переопределяю метод on_connection_close в своем классе WebSocketClientConnection, чтобы я мог отследить сбой "сервер на середине соединения". Тем не менее, я не могу сделать это восстановить. Как мне сделать это переподключиться к серверу?
  2. Если сервер уже отключен до подключения, клиентское приложение ничего не вызывает и выглядит идеально. Я не знаю, как поймать эту неудачу. Как я могу поймать этот сбой соединения?

Мой класс WebSocketClientConnection:

class MyWebSocketClientConnection(tornado.websocket.WebSocketClientConnection):
    def on_connection_close(self):
        super(MyWebSocketClientConnection, self).on_connection_close()
        print "connection closed"

Благодарю.

2 ответа

Решение

websocket_connect возвращает Future; чтобы увидеть, удалось это или нет, вы должны изучить Future (вероятно, передавая его в сопрограмме). Кроме того, после установления соединения вы должны пойти в read_message петля. Даже если вы не ожидаете, что клиент отправит какие-либо сообщения, вам все равно следует позвонить read_messageэто то, как вы будете закрывать соединения после установки (read_message вернет None).

@gen.coroutine
def my_websocket_client(url):
    ws = yield websocket_connect(url)
    while True:
        msg = yield ws.read_message()
        if msg is None: break
        # do stuff with msg

Кстати, после того, как я понял, я написал пример пары клиент / сервер Tornado WebSocket, чтобы продемонстрировать, как это сделать.

https://github.com/ilkerkesen/tornado-websocket-client-example

Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам