2013-01-11 1 views
8

Ich habe eine einfache webserver wieIntegration WebSockets mit einem Standard-http.Server

var http = require('http'), 
    url = require('url'); 
var server = http.createServer(function (req, res) { 
    var uri = url.parse(req.url).pathname; 
    if (uri == '/') { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
    return; 
    } 

    res.writeHead(404, {'Content-Type': 'text/plain'}); 
    res.end('File not found'); 
}); 
server.listen(0, '127.0.0.1'); 

möchte ich nun einen einzigen Weg verbinden (zum Beispiel /ws) zu einem WebSocket, aber der Rest des unmodifizierten Server verlassen .

Allerdings scheint ws erfordern, dass ich einen dedizierten Server einrichten (mit allem, was dazu gehört, wie SSL-Terminierung, Sicherheitskonfiguration und Portzuweisung).

Wie kann ich nur den Pfad /ws zu einer Websocket-Implementierung beenden?

+0

Vielleicht könnte die Verwendung eines Reverseproxys für eingehende Verbindungen hilfreich sein. – Philipp

Antwort

9

ich empfehlen würde mit der websocket package, es ist ein

Websocket Client-& Server-Bibliothek Implementierung das WebSocket-Protokoll gemäß RFC 6455.

Was ich wollte, deshalb benutze ich es. Es ist unglaublich schmerzlos zu verwenden und ich mache tatsächlich sowohl wss als auch ws Verbindungen zu node.js von html Clients, die reine Javascript websockets benutzen.

Das Git-Projekt ist aktiv, wenn ich Probleme gepostet habe, habe ich am selben Tag eine Antwort erhalten. Ein Beispiel aus dem obigen Link zeigt, wie einfach es ist:

var WebSocketServer = require('websocket').server; 
var http = require('http'); 

var server = http.createServer(function(request, response) { 
    console.log((new Date()) + ' Received request for ' + request.url); 
    response.writeHead(404); 
    response.end(); 
}); 
server.listen(8080, function() { 
    console.log((new Date()) + ' Server is listening on port 8080'); 
}); 

wsServer = new WebSocketServer({ 
    httpServer: server, 
    autoAcceptConnections: false 
}); 

function originIsAllowed(origin) { 
    // put logic here to detect whether the specified origin is allowed. 
    return true; 
} 

wsServer.on('request', function(request) { 
    if (!originIsAllowed(request.origin)) { 
     // Make sure we only accept requests from an allowed origin 
     request.reject(); 
     console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); 
     return; 
    } 

    var connection = request.accept('echo-protocol', request.origin); 
    console.log((new Date()) + ' Connection accepted.'); 
    connection.on('message', function(message) { 
     if (message.type === 'utf8') { 
      console.log('Received Message: ' + message.utf8Data); 
      connection.sendUTF(message.utf8Data); 
     } 
     else if (message.type === 'binary') { 
      console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); 
      connection.sendBytes(message.binaryData); 
     } 
    }); 
    connection.on('close', function(reasonCode, description) { 
     console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); 
    }); 
}); 

Ich sollte beachten Sie jedoch, dass die Subprotokolle nicht offensichtlich ist, da es kein Beispiel. Es gibt einige Fragen auf der Git-Website für das Projekt, die Sie jedoch in die richtige Richtung führen.

+0

Ja, das scheint die beste Wahl zu sein, obwohl wie erwähnt der Beispielcode saugt. * Ich * habe die Frage im github issue tracker gestellt;) – phihag

+0

Wenn du magst kannst du mein Projekt auf [github] anschauen (https://github.com/jamesjenner/videre-server.js/blob/master/client_comms. js), es ist relativ sauber und zeigt ein Beispiel für die gleichzeitige Verwendung von ws und wss. Ich führe auch eine Protokollprüfung durch und mache meine eigene Authentifizierung über bcrypt. Hinweis: Ich ändere es derzeit, um konfigurierbare Verbindungsarten zu unterstützen (nur sichere, nicht sichere, gemischte Modi), die in den nächsten 8 Stunden durchgeführt werden sollten. – Metalskin

+0

Ich habe ein neues Projekt erstellt, das eine vollständige Websocket-Implementierung zwischen einem node.js-Backend und einem HTML-Frontend bereitstellt. Es wurde entwickelt, um als Vorlage für die Erstellung einer eigenen Lösung verwendet zu werden. https://github.com/jamesjenner/meltingpot Es enthält ein vollständiges Arbeitsbeispiel, das sehr einfach zu erweitern ist. – Metalskin

1

Sie können die socket.io am selben Port mit Ihrer App hinzufügen. Wenn Sie den/ws Pfad wollen, dann verwenden:

var io = require('socket.io').listen(httpServer, { resource: '/ws/socket.io' }); 

Oder haben /ws Punkt /ws/socket.io

+1

Das sieht gut aus, aber ich bin erstaunt zu erfahren, dass 'socket.io' tatsächlich ** einfache WebSockets unterstützt. (Http://stackoverflow.com/questions/10049587/destroying-non-socket- io-upgrade-error-in-socket-io-node-js), aber nur ihr eigenes Protokoll darüber. – phihag

+1

Das ist eine häufige Missverständnisse - Leute (einschließlich des Autors) conflate socket.io mit WebSockets, wenn in der Praxis socket.io präsentiert nur eine WebSocket-ähnliche Schnittstelle, die WebSockets möglicherweise als zugrunde liegenden Transport * verwendet *. Oder vielleicht nicht. – Alnitak