在对Node.js服务器发出HTTP请求/响应后保持套接字打开

时间:2012-04-02 03:49:34

标签: http node.js

为了支持基于HTTP的协议(Icecast源协议),我需要能够在HTTP请求完成后使用Node.js的http.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>

这是为了支持互联网广播流的来源,在这种情况下,流数据的来源是客户端。

有什么方法可以使用内置的http.Server中的Node.js吗?我试过这个:

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类吗?

3 个答案:

答案 0 :(得分:0)

由于它报告HTTP/1.0作为协议版本,服务器可能正在关闭连接。如果您的客户端是您可以控制的,您可能想尝试设置keep alive标头(我认为Connection: Keep-Alive是正确的。)

答案 1 :(得分:0)

我解决这个问题的方法是重新发明轮子并编写自己的HTTP-ish服务器。不完美,但它的确有效。希望有些这些库存Node.js类的内部有一天会暴露出来。

答案 2 :(得分: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数据,但尚未在压力下对其进行测试。