WebSocket: Fehler bei der WebSocket-handshake: Gesendet nicht leer "Sec-WebSocket-Protocol" - header, aber keine Antwort empfangen wurde
Ich versuche zu schaffen, eine WS-Verbindung mit meinem tornado-server. Der server-code ist einfach:
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
print("WebSocket opened")
def on_message(self, message):
self.write_message(u"You said: " + message)
def on_close(self):
print("WebSocket closed")
def main():
settings = {
"static_path": os.path.join(os.path.dirname(__file__), "static")
}
app = tornado.web.Application([
(r'/ws', WebSocketHandler),
(r"/()$", tornado.web.StaticFileHandler, {'path':'static/index.html'}),
], **settings)
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Ich kopieren eingefügt, die der client-code von hier:
$(document).ready(function () {
if ("WebSocket" in window) {
console.log('WebSocket is supported by your browser.');
var serviceUrl = 'ws://localhost:8888/ws';
var protocol = 'Chat-1.0';
var socket = new WebSocket(serviceUrl, protocol);
socket.onopen = function () {
console.log('Connection Established!');
};
socket.onclose = function () {
console.log('Connection Closed!');
};
socket.onerror = function (error) {
console.log('Error Occured: ' + error);
};
socket.onmessage = function (e) {
if (typeof e.data === "string") {
console.log('String message received: ' + e.data);
}
else if (e.data instanceof ArrayBuffer) {
console.log('ArrayBuffer received: ' + e.data);
}
else if (e.data instanceof Blob) {
console.log('Blob received: ' + e.data);
}
};
socket.send("Hello WebSocket!");
socket.close();
}
});
Wenn er versucht zu verbinden, bekomme ich die folgende Ausgabe auf dem browser-Konsole:
WebSocket connection to 'ws://localhost:8888/ws' failed: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received
Warum ist das so?
- Posten Sie Ihre Verbindung mit dem client-code, oder wir werden zu erraten...
- Ich benutzte die
Chat-1
Protokoll. Schließlich habe ich gelöscht, das Teil, und öffnete die WS ohne Angabe von Protokoll und arbeitet auf diese Weise. Ich bin immer noch interessiert, wie ich das konfigurieren der server-Seite, es zu akzeptieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits in whatwg.org's Websocket-Dokumentation (es ist eine Kopie von der Norm-Entwurf):
Dein server Antworten die websocket-Verbindung-request mit leerer
Sec-WebSocket-Protocol
header, da es nicht die Unterstützung derChat-1
subprotocol.Da bist du schreiben der server-Seite und client-Seite (und, sofern Ihr das schreiben einer API, die Sie verwenden wollen), es sollte nicht super wichtig, ein bestimmtes subprotocol Namen.
Können Sie dieses Problem beheben, indem entweder das entfernen der subprotocol Namen von der javascript-Verbindung:
Oder ändern Sie Ihre server unterstützt das Protokoll angefordert.
Ich könnte Ihnen ein Ruby-Beispiel, aber ich kann nicht geben ein Python-Beispiel, da ich nicht genügend Informationen.
BEARBEITEN (Ruby-Beispiel)
Da wurde ich gebeten, in den Kommentaren, hier ist ein Ruby Beispiel.
Diesem Beispiel erfordert die
iodine
HTTP/WebSockets server, da es unterstützt dierack.upgrade
Spezifikation Entwurf (Konzept detaillierte hier) und fügt ein pub/sub-API.Server-code kann entweder ausgeführt durch das terminal oder als Rack-Anwendung in einem
config.ru
- Datei (runiodine
von der Befehlszeile aus um den server zu starten):Um den code zu testen, wird die folgende JavaScript funktionieren sollte: