Tornado WebSockets - InvalidStateError "Still in CONNECTING State"

javascript, python, ssl, tornado, websocket

Solution

Don't let your socket send data until its ready state is connected.

These functions may help:

function sendMessage(msg) {
        waitForSocketConnection(nvWS, function() {
            ws.send(msg);
        });
    };


function waitForSocketConnection(socket, callback){
        setTimeout(
            function(){
                if (socket.readyState === 1) {
                    if(callback !== undefined){
                        callback();
                    }
                    return;
                } else {
                    waitForSocketConnection(socket,callback);
                }
            }, 5);
    };

Problem

I am writing on a web-application where I want to send JSON-Code from the client-side to the server-side over Tornado WebSockets with SSL. When I want to build a connection, Google Chrome shows in the console-log the error: ``` Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING State. ``` My python server looks like this: ``` from tornado import websocket, web, ioloop import json from sqlite3functions import * class SocketHandler(websocket.WebSocketHandler): def on_message(self, message): handleRequest(self, json.loads(message), True) print(message) def handleRequest(obj, message, isWebsock): ... def writeResponse(obj, message, isWebsock): if (isWebsock): obj.write_message(message) else: print(message) obj.write(message) print('msg sent') app = web.Application([ (r'/w', SocketHandler) ]) if __name__ == "__main__": app.listen(8888) ioloop.IOLoop.instance().start() ``` My client: ``` var ws; function connect() { ws = new WebSocket('wss://127.0.0.1:8888/w'); ws.onopen = function() { ws.send("Message to send"); }; } $(document).ready(function() { connect(); $("#Button").on('click', function() { ... ws.send(data); }); }); ``` Thanks

Original source