• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Wie komme ich an WebSockets Fehlermeldung

NetAktiv

Senior HTML'ler
Hallo,

ich wollte ein wenig mit WebSockets herumspielen und habe dazu den beigefügten Code (extrakt) verwendet.

Code:
    try {
        var oWebsocket = new WebSocket("ws://localhost:9000/websocket_server.php");
    }  catch(e) {
        alert("Fehler beim Init " + e); ;
    }
  
    oWebsocket.onerror = function(ev){ alert("Fehler - " + JSON.stringify(ev)); };
    oWebsocket.onclose = function(ev){ alert("Close  - " + JSON.stringify(ev)); };

Ist mein Server nicht gestartet, dann erhalte ich in den Entwicklertools im Browser-Log die Meldung:
WebSocket connection to 'ws://localhost:9000/websocket_server.php' failed:
Error in connection establishment: net::ERR_CONNECTION_REFUSED

Nun hätte ich erwartet, dass ich diese Meldung im Catch-Block erhalte, aber der Catch wird nicht ausgelöst. Statt dessen löst der Fehler die beiden Events onerror und onclose aus, aber auch dort finde ich die Fehlermeldung nicht. Wie also komme ich im Script an diese detaillierte Fehlernachricht.
 
Werbung:
du definierst das onerror ausserhalb des Scopes des oWebsocket.

Mit:

Code:
try {
        var oWebsocket = new WebSocket("ws://localhost:9000/websocket_server.php");
        oWebsocket.onerror = function(ev){ alert("Fehler - " + JSON.stringify(ev)); };
        oWebsocket.onclose = function(ev){ alert("Close  - " + JSON.stringify(ev)); };

    }  catch(e) {
        alert("Fehler beim Init " + e); ;
    }

müsste es gehen

/e Quatsch... ging ja vorher auch.. function Scope...

aber auf JSFiddle wird bei mir das ev, gestringified...

Im CloseEvent kommst du sogar an den close Code ran mit ev.close

Die wären dann HIER, definiert
 
Zuletzt bearbeitet:
Hallo theCain,
ich hatte die Variable schon im Scope definiert, das leider aber beim Reduzieren auf das Beispiel nicht korrekt wiedergegeben. ich hatte im Original:
Code:
var oWebsocket = null;
try {
        oWebsocket = new WebSocket("ws://localhost:9000/websocket_server.php");
    }  catch(e) {
        alert("Fehler beim Init " + e); ;
    }
    oWebsocket.onerror = function(ev){ alert("Fehler - " + JSON.stringify(ev)); };
    oWebsocket.onclose = function(ev){ alert("Close  - " + JSON.stringify(ev)); };

Egal wie, auch wenn ich die Events in den try mit aufnehme, geht es nicht. Das komische ist ja, dass der Browser den new anmeckert, aber das Objekt dennoch initialisiert wird, so dass man trotz nicht erfolgter Verbindung noch die Events zuordnen kann und diese sogar bedient und ausgelöst werden! Zumindest ist das bei den Tests mit Chrome so.
 
Werbung:
Also irgendwie verstehe ich das alles nicht. Ich hätte erwartet, dass das JSON.stringify mir alle Properties der Eventy liefert, das ist aber bei weitem nicht der Fall. Daher habe ich mal die folgende Funktion verwendet, die scheinbar wesentlich mächtiger ist, zumindest ein ganz anderes Ergebnis liefert, und die ich bei http://stackoverflow.com/questions/3334341/json-to-string-variable-dump gefunden habe

Code:
function dump(x, indent) {
    var indent = indent || '';
    var s = '';
    if (Array.isArray(x)) {
        s += '[';
        for (var i=0; i<x.length; i++) {
            s += dump(x[i], indent)
            if (i < x.length-1) s += ', ';
        }
        s +=']';
    } else if (x === null) {
      s = 'NULL';
    } else switch(typeof x) {
        case 'undefined':
            s += 'UNDEFINED';
            break;
        case 'object':
            s += "{ ";
            var first = true;
            for (var p in x) {
                if (!first) s += indent + '  ';
                s += p + ': ';
                s += dump(x[p], indent + '  ');
                s += "\n"
                first = false;
            }
            s += '}';
            break;
        case 'boolean':
            s += (x) ? 'TRUE' : 'FALSE';
            break;
        case 'number':
            s += x;
            break;
        case 'string':
            s += '"' + x + '"';
            break;
        case 'function':
            s += '<FUNCTION>';
            break;
        default:
            s += x;
            break;
    }
    return s;
}

Diese jsoanDump Funktion liefert für den onerror Event (und unten das Beispiel für den onclose Event) ausführliche Informationen, aber mehr brauchbares zur Fehlerursache als den Close-Code 1006 kann ich nirgends entdecken. Es bleibt also nach wie vor offen, wie ich an die Informationen aus dem Browser Log komme.

Code:
{ isTrusted: TRUE
  type: "error"
  target: { url: "ws://php.netaktiv.local:9000/websocket_server.php"
    readyState: 3
    bufferedAmount: 0
    onopen:
    onerror:
    onclose:
    extensions: ""
    protocol: ""
    onmessage:
    binaryType: "blob"
    close:
    send:
    CONNECTING: 0
    OPEN: 1
    CLOSING: 2
    CLOSED: 3
    addEventListener:
    removeEventListener:
    dispatchEvent:
}
  currentTarget: { url: "ws://php.netaktiv.local:9000/websocket_server.php"
    readyState: 3
    bufferedAmount: 0
    onopen:
    onerror:
    onclose:
    extensions: ""
    protocol: ""
    onmessage:
    binaryType: "blob"
    close:
    send:
    CONNECTING: 0
    OPEN: 1
    CLOSING: 2
    CLOSED: 3
    addEventListener:
    removeEventListener:
    dispatchEvent:
}
  eventPhase: 2
  bubbles: FALSE
  cancelable: FALSE
  defaultPrevented: FALSE
  timeStamp: 1451422281918
  path: []
  srcElement: { url: "ws://php.netaktiv.local:9000/websocket_server.php"
    readyState: 3
    bufferedAmount: 0
    onopen:
    onerror:
    onclose:
    extensions: ""
    protocol: ""
    onmessage:
    binaryType: "blob"
    close:
    send:
    CONNECTING: 0
    OPEN: 1
    CLOSING: 2
    CLOSED: 3
    addEventListener:
    removeEventListener:
    dispatchEvent:
}
  returnValue: TRUE
  cancelBubble: FALSE
  stopPropagation:
  stopImmediatePropagation:
  preventDefault:
  initEvent:
  NONE: 0
  CAPTURING_PHASE: 1
  AT_TARGET: 2
  BUBBLING_PHASE: 3
  MOUSEDOWN: 1
  MOUSEUP: 2
  MOUSEOVER: 4
  MOUSEOUT: 8
  MOUSEMOVE: 16
  MOUSEDRAG: 32
  CLICK: 64
  DBLCLICK: 128
  KEYDOWN: 256
  KEYUP: 512
  KEYPRESS: 1024
  DRAGDROP: 2048
  FOCUS: 4096
  BLUR: 8192
  SELECT: 16384
  CHANGE: 32768
}

und für den onclose Event
Code:
{ wasClean: FALSE
  code: 1006
  reason: ""
  type: "close"
  target: { url: "ws://php.netaktiv.local:9000/websocket_server.php"
    readyState: 3
    bufferedAmount: 0
    onopen:
    onerror:
    onclose:
    extensions: ""
    protocol: ""
    onmessage:
    binaryType: "blob"
    close:
    send:
    CONNECTING: 0
    OPEN: 1
    CLOSING: 2
    CLOSED: 3
    addEventListener:
    removeEventListener:
    dispatchEvent:
}
  currentTarget: { url: "ws://php.netaktiv.local:9000/websocket_server.php"
    readyState: 3
    bufferedAmount: 0
    onopen:
    onerror:
    onclose:
    extensions: ""
    protocol: ""
    onmessage:
    binaryType: "blob"
    close:
    send:
    CONNECTING: 0
    OPEN: 1
    CLOSING: 2
    CLOSED: 3
    addEventListener:
    removeEventListener:
    dispatchEvent:
}
  eventPhase: 2
  bubbles: FALSE
  cancelable: FALSE
  defaultPrevented: FALSE
  timeStamp: 1451422281920
  path: []
  srcElement: { url: "ws://php.netaktiv.local:9000/websocket_server.php"
    readyState: 3
    bufferedAmount: 0
    onopen:
    onerror:
    onclose:
    extensions: ""
    protocol: ""
    onmessage:
    binaryType: "blob"
    close:
    send:
    CONNECTING: 0
    OPEN: 1
    CLOSING: 2
    CLOSED: 3
    addEventListener:
    removeEventListener:
    dispatchEvent:
}
  returnValue: TRUE
  cancelBubble: FALSE
  stopPropagation:
  stopImmediatePropagation:
  preventDefault:
  initEvent:
  NONE: 0
  CAPTURING_PHASE: 1
  AT_TARGET: 2
  BUBBLING_PHASE: 3
  MOUSEDOWN: 1
  MOUSEUP: 2
  MOUSEOVER: 4
  MOUSEOUT: 8
  MOUSEMOVE: 16
  MOUSEDRAG: 32
  CLICK: 64
  DBLCLICK: 128
  KEYDOWN: 256
  KEYUP: 512
  KEYPRESS: 1024
  DRAGDROP: 2048
  FOCUS: 4096
  BLUR: 8192
  SELECT: 16384
  CHANGE: 32768
}
 
meines Wissens geht das nicht, da das eine Message des Browsers ist.
Firefox und Chrome haben absolut identische Meldungen, aber auch eine gemeinsame Vergangenheit. Die Meldung vom MS Edge unterscheidet sich dagegen völlig
WebSocket Error: Network Error 12029, Die Serververbindung konnte nicht hergestellt werden.
Zusammengenommen folge ich dir, das scheint in der Tat vom Browser zu kommen. Aber ich finde die Implementierung insgesamt recht dämlich, wenn man bei einer nicht existierenden Netzwerk Ressource keine sinnvollen Fehler im Script bekommt, sondern nur einen Close-Event mit dem Universalcode 1006.
 
Werbung:
Noch eine Ergänzung für andere, die eventuell an ähnlichen Problemen arbeiten. Ich habe mal den Handshake verändert und einen Session Connect abgelehnt, indem ich eine HTTP-Response mit Code 409 gesendet habe, wie es bei den offenen Issues vorgeschlagen wird https://github.com/theturtle32/WebSocket-Node/issues/46. Auch hier erhalte ich lediglich den Code 1006 im JavaScript, in den Browser Entwicklertools aber die exaktere Meldung
WebSocket connection to 'ws://php.netaktiv.local:9000/websocket_server.php' failed: Error during WebSocket handshake: Unexpected response code: 409
Auch hier hat man das Problem, dass man mit JavaScript nicht an den HTTP Header kommt und der Browser diese Informationen auch nicht über einen Event oder eine Exception weiter gibt. Selbst der Browser zeigt meine erweiterten Header Daten nicht an
X-WebSocket-Reject-Reason:User Test already registered
 
Zurück
Oben