2014-09-11 12 views
32

Supponiamo di avere un server nodo avviato con la porta nn e che non sia presente alcun servizio WebSocket.Come catturare la connessione `WebSocket a 'ws: // xxx: nn' fallita: connessione chiusa prima di ricevere un errore di risposta handshake`?

E il problema è il mio client tenta di connettere un servizio WebSocket a questo server.

Ovviamente, non è stato possibile connettersi al server.

ma non ho potuto prendere questo errore, il mio codice cliente come segue:

try { 
    this.ws = new WebSocket('ws://xxx:nn'); 
} catch (e) { 
    fallback(); 
    console.warn(e); 
} 

La mia aspettativa è il metodo fallback ottenere chiamato durante il collegamento non è riuscito, ma in realtà l'errore che posso farlo catturato da sopra try...catch

Qualcuno sa come rilevare l'errore nel mio caso?

+5

sei finito a trovare una soluzione per questo? – orange

+2

Possibile duplicato di [Javascript non rileva errori nell'istanziazione WebSocket] (http://stackoverflow.com/questions/31002592/javascript-doesnt-catch-error-in-websocket-intestation) –

risposta

4

È possibile registrarsi per onError callback dell'oggetto websocket

exampleSocket.onerror=function(event){ 
    console.log("Error"); 
} 

È possibile fare riferimento seguente esempio. http://jsfiddle.net/g28yuymv/1/

cattura esempio errore http://jsfiddle.net/g28yuymv/4/

+2

Questo non funzionerà, io provato. Il mio caso è che ho un server in esecuzione su port 'nn', ma non esiste alcun servizio webSocket su di esso. Mentre il client tenta di connettere questo server usando websocket, viene generato l'errore, e né 'try..catch' né' onerror' non possono intercettare questa eccezione – Howard

+2

OK @ Howard.Nel mio esempio (http: // jsfiddle. net/g28yuymv/10 /) Sono in grado di ottenere un evento di errore se non ci sono servizi WS in esecuzione sulla porta richiesta. Se hai ospitato alcun servizio WS su qualsiasi cloud pubblico fammi sapere l'url di test. Secondo me stai colpendo il comportamento di "errore del server interno 500". – shivakumar

+0

Grazie. Posso fare più test per questo comportamento – Howard

3

readyState insiemi di proprietà a 1 quando la connessione è riuscita quindi può essere utilizzato per determinare lo stato di connessione, connessione socket richiede solitamente < 1 sec, quindi possiamo tranquillamente prendere 3 sec gap e quindi controllare lo stato della connessione.

seguito riporta il codice

this.ws = new WebSocket('ws://xxx:nn'); 

     setTimeout(function() { 


      if (this.ws.readyState != 1) { 
       alert("Problem connection , kindly contact system admin ."); 
      } 


     }, 3000); 
+0

Aggiungi una spiegazione del tuo codice alla tua risposta. – rgettman

+0

aggiunta spiegazione @rgettman. –

7

Guardando le specifiche HTML5 WebSockets, è possibile passare un valore al metodo close(). Quindi sul listener di eventi onclose() è possibile verificare tale valore. Questo ti dà l'opportunità di impostare i gestori per diversi scenari di disconnessione e quindi gestire tutto il resto come un errore generico.

https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#close()

var _websocket; 

function wsConnect() { 
    if (_websocket) { 
    _websocket.close(3001); 
    } else { 
    _websocket = new WebSocket("wss://echo.websocket.org1"); 
    _websocket.onopen = function() { 
     console.log('connected'); 
    }; 
    _websocket.onmessage = function(msg) { 
     console.log(msg); 
    }; 

    _websocket.onclose = function(evt) { 
     if (evt.code == 3001) { 
     console.log('ws closed'); 
     _websocket = null; 
     } else { 
     _websocket = null; 
     console.log('ws connection error'); 
     } 
    }; 

    _websocket.onerror = function(evt) { 
     if (_websocket.readyState == 1) { 
     console.log('ws normal error: ' + evt.type); 
     } 
    }; 
    } 
} 

wsConnect(); 

dolce violino: https://jsfiddle.net/lamarant/ry0ty52n/

+0

Volevo rilevare l'errore ECONREFUSED ogni volta che il mio script ha provato a riconnettersi al server websocket, il codice sopra funziona perfettamente, ha salvato il mio script nodejs da arresti anomali durante la riconnessione. – Jayant

Problemi correlati