2012-04-02 50 views
1

爲了支持基於HTTP的協議(Icecast Source Protocol),我需要能夠使用來自Node.js的http.Server的套接字,一旦HTTP請求是完了。示例請求如下所示:在HTTP請求/響應Node.js服務器後保持套接字打開

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> 

這是爲了支持互聯網廣播流的來源,在這種情況下,流數據的來源是客戶端。

有什麼辦法可以使用Node.js的內置http.Server?我曾經嘗試這樣做:

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'); 

如果我telnet到端口1337和提出請求,我能看到的是什麼我鍵入服務器控制檯窗口中,但隨後的服務器關閉連接的第一對夫婦的字符。理想情況下,我會保持該套接字無限期地打開,並且一旦發出初始請求,就將HTTP部分從循環中取出。

這可能與股票http.Server類?

回答

0

我對這個問題的解決方案是重新發明輪子並編寫我自己的HTTP-ish服務器。不完美,但它的工作原理。希望這些存儲Node.js類的內部有一天會暴露出來。

0

由於它報告HTTP/1.0作爲協議版本,服務器可能正在關閉連接。如果你的客戶端是你可以控制的東西,你可能想要設置keep alive頭文件(Connection: Keep-Alive是我認爲正確的)。

0

我是在一個類似的情況,這裏就是我得到了它的工作:

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); 

套接字現在將繼續開放,因爲沒有http.serverResponse.end()被調用,但頭部有被衝紅了。

如果你想發送的響應數據(不是你需要一個的Icecast源連接),簡單地說:

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

當關閉連接只需調用res.end()

我已經使用這種方法成功地流式傳輸MP3數據,但沒有在壓力下進行測試。

相關問題