2012-04-02 8 views
1

Um ein Protokoll (Icecast Source Protocol) basierend auf HTTP zu unterstützen, muss ich in der Lage sein, einen Socket von Node.js http.Server zu verwenden, sobald die HTTP-Anfrage ist fertig. Eine Probe Anfrage sieht wie folgt aus:Keep Socket nach HTTP-Anfrage/Antwort auf Node.js Server

Client->Server: GET/HTTP/1.0 
Client->Server: Some-Headers:header_value 
Client->Server: 
Server->Client: HTTP/1.0 200 OK 
Server->Client: 
Client->Server: <insert stream of binary data here> 

Dies ist die Quelle eines Internet-Radio-Stream, um die Quelle der Stromdaten ist der Kunde in diesem Fall zu unterstützen.

Gibt es eine Möglichkeit, den integrierten http.Server von Node.js zu verwenden? Ich habe dies versucht:

this.server = http.createServer(function (req, res) { 
    console.log('connection!'); 
    res.writeHead(200, {test: 'woot!'}); 
    res.write('test'); 
    res.write('test2'); 
    req.connection.on('data', function (data) { 
     console.log(data); 
    }); 
}).listen(1337, '127.0.0.1'); 

Wenn ich in Port 1337 Telnet und eine Anfrage machen, ich bin in der Lage, die ersten paar Zeichen zu sehen, was ich auf dem Server-Konsole-Fenster eingeben, aber dann schließt der Server die Verbindung. Im Idealfall würde ich diesen Socket unbegrenzt offen halten und den HTTP-Teil nach der ersten Anfrage aus der Schleife nehmen.

Ist dies mit der Aktie http.Server Klasse möglich?

Antwort

0

Meine Lösung für dieses Problem war, das Rad neu zu erfinden und meinen eigenen HTTP-ish-Server zu schreiben. Nicht perfekt, aber es funktioniert. Hoffentlich werden die Innereien von einigen dieser Aktien Node.js Klassen eines Tages ausgesetzt werden.

0

Da die Protokollversion HTTP/1.0 gemeldet wird, schließt der Server wahrscheinlich die Verbindung. Wenn Ihr Client etwas ist, über das Sie die Kontrolle haben, sollten Sie versuchen, den keep alive-Header zu setzen (Connection: Keep-Alive ist der richtige, glaube ich).

0

ich in einer ähnlichen Situation war, ist hier, wie ich es bekam zu arbeiten:

http.createServer(function(res, req){ 

// Prepare the response headers 

res.writeHead(200); 

// Flush the headers to socket 

res._send(''); 

// Inform http.serverResponse instance that we've sent the headers 

res._headerSent = true; 

}).listen(1234); 

Der Sockel bleibt nun offen, da keine http.serverResponse.end() wurde aufgerufen, aber die Header haben wurde gespült.

Wenn Sie Antwortdaten senden möchten (nicht, dass Sie für einen Icecast-Source-Anschluss benötigen), einfach:

res.write(buffer_or_string); 
res._send(''); 

Wenn die Verbindung geschlossen wird nur res.end() nennen.

Ich habe erfolgreich MP3-Daten mit dieser Methode gestreamt, aber nicht unter Stress getestet.