2012-04-02 55 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数据,但没有在压力下进行测试。

相关问题