Я бегу очень простой сервер эхо 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
может быть виновником.
Я создал [github issue] (https://github.com/tornadoweb/tornado/issues/1793), что любой, у кого есть такая же проблема, может ударить – user25064
, скопированный из github, - «Windows не является полностью поддерживаемой платформой для Tornado, так что вы более или менее самостоятельно отлаживаете это ». – user25064