2016-07-29 2 views
4

Я бегу очень простой сервер эхо WebSocket, как показано ниже:Соединение немедленно закрывается на открытом

#!/usr/bin/python 

import datetime 
import tornado.httpserver 
import tornado.websocket 
import tornado.ioloop 
import tornado.web 



class WSHandler(tornado.websocket.WebSocketHandler): 
    clients = [] 
    def open(self): 
     print('new connection') 
     self.write_message("Hello World") 
     WSHandler.clients.append(self) 

    def on_message(self, message): 
     print('message received %s' % message) 
     self.write_message('ECHO: ' + message) 

    def on_close(self): 
     print('connection closed') 
     WSHandler.clients.remove(self) 

    @classmethod 
    def write_to_clients(cls): 
     print("Writing to clients") 
     for client in cls.clients: 
      client.write_message("Hi there!") 

    def check_origin(self, origin): 
     return True 



application = tornado.web.Application([ 
    (r'/websocket', WSHandler), 
]) 


if __name__ == "__main__": 
    http_server = tornado.httpserver.HTTPServer(application) 
    http_server.listen(80) 
    tornado.ioloop.IOLoop.instance().start() 

Я подключая к этому с JavaScript, как показано ниже

var ws = new WebSocket("ws://localhost:80/websocket"); 

В консоли я вижу

new connection 
connection closed 

Я не понимаю, почему я вижу connection closed в консоли. Клиент также указывает, что соединение закрыто, но я не вижу веских оснований для этого. Любая помощь будет принята с благодарностью. Чтобы выполнить репликацию, запустите код python как admin, откройте любую консоль JS и введите JS-код. Мой желаемый результат заключается в том, что сокет не будет немедленно закрыт. Это несколько основано на том, что я читал в tornado docs.


редактировать обновление закомментировав self.write_message("Hello World") в методе open, соединение не закрывается. Однако запуск кода примера из документов теперь дает что-то интересное.

var ws = new WebSocket("ws://localhost:80/websocket"); 
ws.onopen = function() { 
    ws.send("Hello, world"); 
}; 
ws.onmessage = function (evt) { 
    alert(evt.data); 
}; 

стороне сервера выход

new connection 
message received Hello, world 
connection closed 

Там нет соответствующего предупреждения на стороне клиента, как и ожидалось

Новый вопрос такой же, как старый, который почему говорят, что сервер connection closed ? Похоже, self.write_message может быть виновником.

+0

Я создал [github issue] (https://github.com/tornadoweb/tornado/issues/1793), что любой, у кого есть такая же проблема, может ударить – user25064

+0

, скопированный из github, - «Windows не является полностью поддерживаемой платформой для Tornado, так что вы более или менее самостоятельно отлаживаете это ». – user25064

ответ

0

Не уверен, что это полезно в любом случае, но я запустил ваш код, и он работает точно так, как вы ожидали, что он сработает. Я не получаю сообщение закрытого соединения, как указано в вашем вопросе, до тех пор, пока я не позвоню ws.close(). (торнадо 4.4.1).

Какая бы проблема ни была, это похоже на вашу среду, а не на ваш код.

+3

Вероятно, это комментарий. – jfriend00

+0

Спасибо! Я нахожусь в Windows 7 с Python 3.4.4 с Tornado 4.4. Я выбросил javascript-код в консоль js в chrome на случайных веб-сайтах. – user25064

+0

У меня нет репутации, чтобы комментировать - я начал использовать Stackoverflow не так давно, поэтому приношу извинения за не комментирование. Я запускал это на Ubuntu 16.04, Python 3.5.2 и Tornado 4.4.1. Работает так, как должно. –

Смежные вопросы