2016-07-22 11 views
1

Ich führe die echo.websocket.org Demo für die ws WebSocket library auf meinem lokalen Rechner.Ist der WS WebSocket-Client defekt? echo.websocket.org Demo schlägt mit einem 404 bei lokaler Ausführung fehl

var WebSocket = require('ws');            
var ws = new WebSocket('ws://echo.websocket.org/', {      
    protocolVersion: 8,              
    origin: 'http://websocket.org' 
}); 

ws.on('open', function open() { 
    console.log('connected'); 
    ws.send(Date.now().toString(), {mask: true}); 
}); 

ws.on('close', function close() { 
    console.log('disconnected'); 
}); 

ws.on('message', function message(data, flags) { 
    console.log('Roundtrip time: ' + (Date.now() - parseInt(data)) + 'ms', flags); 

    setTimeout(function timeout() { 
    ws.send(Date.now().toString(), {mask: true}); 
    }, 500); 
}); 

ich diesen Code mit Browserify zusammengestellt (Details in den repo) und testete ihn in Chrome und Safari.

es mit einem 404 auf Chrome nicht 51.0.2704

Fetch API cannot load http://echo.websocket.org/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 404. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. 

Es schlägt mit 400 auf Safari 9.1.1

Failed to load resource: the server responded with a status of 400 (WebSocket Upgrade Failure) 

dies bei der Fehlersuche, habe ich einen lokalen WebSocket-Server mit Node.js/Express hat einen WebSocket-Client mit SwiftWebSocket für iOS erstellt und konnte eine Verbindung erfolgreich herstellen. Ich habe dann den Code oben auf diese neue URL gerichtet, und die Verbindung schlägt immer noch fehl.

Ist der WS-Client defekt?

+0

Was meinen Sie mit "browserbasierten WebSocket-Clients"? Wie hat Chrome den Node-Code ausgeführt, um zu 404 zu gelangen, und wo kommt 'fetch' her und warum holst du die ws-URL? – dandavis

+0

@dandavis Ich brauche einen funktionalen WebSocket-Client in Javascript geschrieben. Das ist alles was ich meinte. Ich benutze browserify zum kompilieren, dann habe ich eine HTML-Datei, die auf das kompilierte Skript verweist. Ich weiß nicht, woher Fetch kommt. Die 'ws'-Dokumente erwähnen es nicht als Abhängigkeit, und ich habe keine Knotenmodule installiert, die über das hinausgingen, was die Demo verlangte. –

+0

Interessanterweise hat Safari einen etwas anderen Fehler, den ich oben eingefügt habe. Ich frage mich, ob Fetch eine Chrome-spezifische Sache ist. –

Antwort

0

hier ist eine leichte Vereinfachung, die in Browsern funktioniert, wie sie ist:

var ws = new WebSocket('ws://echo.websocket.org/'); 

ws.addEventListener('open', function open() { 
    console.log('connected'); 
    ws.send(Date.now().toString(), {mask: true}); 
}); 

ws.addEventListener('close', function close() { 
    console.log('disconnected'); 
}); 

ws.addEventListener('message', function message(data, flags) { 
    console.log('Roundtrip time: ' + (Date.now() - parseInt(data)) + 'ms', flags); 

    setTimeout(function timeout() { 
    ws.send(Date.now().toString(), {mask: true}); 
    }, 500); 
}); 

töten nur die erfordern, und on zu addEventListener ändern ...

Sie sollten alle verwenden können gültige URL in der ersten Zeile.

0

Ich habe missverstanden, wie WebSocket funktioniert.

WebSocket ist eine standard, die in most browsers implementiert ist. Sie benötigen keine separate Bibliothek. Das folgende Javascript ist alles, was zum Einrichten einer WebSocket-Verbindung benötigt wird.

var ws = new WebSocket('wss://hostname') 
+0

Hoppla, du hast mich unterbucht, aber ich bin froh, dass du es herausgefunden hast ... – dandavis