2016-08-10 8 views
1

У меня есть HTTP-сервер tornado.Как отправить сообщение с широковещательным сообщением HTTP с торнадо?

Как я могу реализовать сообщение broad-cast с сервером tornado?

Есть ли какая-либо функция для этого или я просто должен отправить обычное HTTP-сообщение всем клиентам, зацикленным.

Я думаю, что если я отправлю нормальное HTTP-сообщение, сервер должен дождаться ответа.

Это не концепция broad-cast.

В противном случае мне нужен другой вариант третьей части для broad-cast?

Прошу дать мне предложение ввести broad-cast.

ответ

1

Короткий ответ: вас может заинтересовать WebSockets. Похоже, что Торнадо поддерживает это.

Более длинный ответ: я предполагаю, что вы имеете в виду передачу с сервера всем клиентам. К сожалению, это не выполнимо концептуально в HTTP/1.1 из-за того, как это продумано. Клиент запрашивает что-то на сервере, и сервер отвечает независимо от всех остальных.

Кроме того, хотя между клиентом и сервером отсутствует запрос, эта связь, как можно сказать, вообще не существует. Поэтому, если вы будете транслировать, вы будете пропускать клиентов, которые в настоящее время не взаимодействуют с сервером.

Конечно, все не так просто. Многие клиенты сохраняют долговременное TCP-соединение при разговоре с сервером, и HTTP-запросы на него для этого. Кроме того, один запрос не является атомарным, и ответ отправляется в пакетах. Люди применяли сервер-push/long-polling перед WebSockets или HTTP/2 при таком подходе, но теперь есть лучшие способы сделать это.

1

В Торнадо нет встроенного представления о широковещательном сообщении. Демонстрационная WebSocket чат включен Торнадо показывает, как цикл по списку клиентов, отправив сообщение каждому:

def send_updates(cls, chat): 
    logging.info("sending message to %d waiters", len(cls.waiters)) 
    for waiter in cls.waiters: 
     try: 
      waiter.write_message(chat) 
     except: 
      logging.error("Error sending message", exc_info=True) 

См https://github.com/tornadoweb/tornado/blob/master/demos/websocket/chatdemo.py