2013-02-28 5 views
6

Es dauert ungefähr 1 Sekunde, um eine Websocket-Verbindung einzurichten, wenn der Client und der Server beide lokal auf meinem Computer ausgeführt werden. Das scheint mir eine ziemlich lange Zeit zu sein - oder? Kann jemand das mit ihren eigenen Erfahrungen vergleichen?Websocket-Verbindungsaufbau dauert relativ lange - ist das normal?


Details:

ich eine websocket Anfrage wie diese haben auf dem Client (Chrome 25, 64 Windows7):

this.ws = new WebSocket('ws://' + host + ':' + port);

Auf der Serverseite habe ich Knoten mit ExpressJS läuft und einaros/ws Handhabung der Aktualisierung und WS-Verbindung.

Ich Timing auf dem Client, von kurz vor der neuen WebSocket() bis ws.onopen Ereignis.

+0

Gibt es Gründe, Sie Socket.io nicht verwenden? –

+0

@ Jean-PhilippeLeclerc Ja, ich habe ein paar verschiedene Bibliotheken ausgewertet, die uns besser gepasst haben. Wie ich es verstehe, verwendet socket.io die ws-Bibliothek unter der Haube (sie ist als eine Abhängigkeit von socket.io in npm aufgeführt). Warum haben Sie mit socket.io schnellere Einrichtungszeiten gesehen? – UpTheCreek

+0

Eigentlich nein. Ich hatte dieses Problem bereits in einem meiner Projekte mit socketio. Es war ein kleines beschissenes Testprojekt, also kümmerte es mich nicht wirklich. Ich habe dieses Problem in meinem neuen Projekt nicht. Ich freue mich immer noch auf die Antwort auf Ihre Frage. –

Antwort

1

Das ist nicht normal.

Ich bin mit Chrome 24 auf Ubuntu mit dem folgenden Testcode (nur Chrome Dev-Konsole anwerfen und fügen Sie ihn in):

function test_ws(uri){ 
    start = new Date().getTime(); 
    ws = new WebSocket(uri); 
    ws.onopen = function(){ 
     console.log("onopen of", uri, "in", (new Date().getTime() - start), "ms"); 
    }; 
} 

Hier sind einige durchschnittliche Ergebnisse, die ich für verschiedene Werte von bekommen haben uri:

  • ws://localhost:6080: 20 ms (benutzerdefinierter python basierter WebSocket-Server)
  • ws://localhost:6090: 3 ms (custom node.js + einaros/ws basierte Web Socket-Server)
  • ws://echo.websocket.org: 130 ms
  • wss://echo.websocket.org: 190 ms

So verwenden sogar eine verschlüsselte Verbindung zu einem öffentlichen Fern Websocket Server ist immer noch weniger als ein Fünftel einer Sekunde im Durchschnitt, bis die offenen Veranstaltung . Die maximale Zeit, die ich gesehen habe, war 250ms. Bei einer lokalen Verbindung sollte die Verzögerung eigentlich nur wenige Millisekunden betragen.

Meine Vermutung wäre, dass Sie Server-Setup eine Reihe von Verarbeitung vor der Annahme der Verbindung macht. Vielleicht initialisieren Sie eine Reihe von Kundendaten im neuen Verbindungshandler?

aktualisieren:

Hier ist ein einfaches einaros/ws basierte WebSocket-Server, der über 3 ms OnOpen Reaktion unter Verwendung des Client-Test-Code gibt:

var WebSocketServer = require('ws').Server 
    , wss = new WebSocketServer({port: 6090}); 
wss.on('connection', function(ws) { 
    console.log("got connection"); 
}); 
+0

Vielen Dank für diese Antwort - diese Zeiten sehen eher so aus, als hätte ich es erwartet. Ich bin im Moment etwa 1100ms im Durchschnitt, der Test ist ziemlich identisch mit Ihnen aufgebaut. Interessant, dass das einaros/ws-Beispiel am schnellsten ist (das ist die Bibliothek, die ich benutze). Es gibt keine explizite Initialisierung der Kundendaten - obwohl ich denke, dass ich die Express-Middlewear als nächstes prüfen werde. Jedenfalls hat diese Information meine Begeisterung erneuert, um dem auf den Grund zu gehen! :) Prost. – UpTheCreek

+0

Interessant. Habe gerade deinen genauen Code - Server und Client (von der Dev-Konsole), Ergebnis: 'onopen von ws: // localhost: 6090 in 1003 ms'! Ich denke, es war damals nicht Express. Weitere Untersuchung erforderlich ... – UpTheCreek

+0

HectorCorrea schlug auf etwas in den Kommentaren oben - es scheint, dass die Verwendung von "localhost" anstelle einer Loopback-IP die Verzögerung einführt. Ich weiß noch nicht warum, oder warum ich etwas Ähnliches auf dem Server sehe (muss das nochmal überprüfen!). Schätze deine Hilfe, um dem auf den Grund zu gehen! – UpTheCreek

6

ich auf diese Frage eine klare Antwort gefunden . Scheinbar verursacht die Verwendung von localhost, dass der Browser versucht, zuerst eine Verbindung zu ipv6 herzustellen, dann nach 0 Sekunden auf ipv4 nach einer Zeitüberschreitung. Das Problem wird gelöst, indem man 127.0.0.1 verwendet, weil es versuchen wird, sich unter Verwendung ipv4 an erster Stelle zu verbinden.

Source

+0

Interessant, danke! – UpTheCreek

+0

4 Jahre später ... danke – ThievingSix