Node.js套接字管道方法不会将最后一个数据包传递给http响应

时间:2013-12-17 09:04:28

标签: node.js sockets tcp pipe response

我有使用Express作为网络应用程序的Node服务器。

此服务器与其他端TCP服务器创建tcp套接字连接。

我正在尝试将tcp数据传递给用户http响应。

它工作正常一段时间,但最后的tcp数据包不会通过管道传输到http响应。

因此,Web浏览器的下载状态已下载99.9%。

我的源代码如下。

任何人都可以帮我解决这个问题吗?

提前致谢。

app.get('/download/*', function(req, res){

    var tcpClient = new net.Socket();

    tcpClient.connect(port, ip, function() {    
        // some logic
    });

    tcpClient.on('data', function(data) {

        /* skip ... */

        tcpClient.pipe(res); // This method is called once in the 'data' event loop

        /* skip ... */
    });

    tcpClient.on('close', function() {
        clog.debug('Connection closed.');
    });

    tcpClient.on('end', function() {
        clog.debug('Connection Ended.');
    });

    tcpClient.on('error', function(err){
        clog.err(err.stack);
    });

});

1 个答案:

答案 0 :(得分:3)

这不是你应该如何使用.pipe()

当您将流输送到另一个流时,您不必自己处理data事件:管道会处理所有事情。此外,data事件在每个数据块上发出,这意味着您可能多次管道()流。

您只需要创建并初始化Socket,然后将其传递给您的响应流:

tcpClient.connect(port, ip, function () {    
    // some logic

    this.pipe(res);
});

编辑:当您在评论中进行了精确处理时,第一个块包含元数据,您只想从其上的第二个块进行管道传输。这是一个可能的解决方案:

tcpClient.connect(port, ip, function () {    
    // some logic

    // Only call the handler once, i.e. on the first chunk
    this.once('data', function (data) {
        // Some logic to process the first chunk
        // ...

        // Now that the custom logic is done, we can pipe the tcp stream to the response
        this.pipe(res);
    });
});

作为旁注,如果要在将tcpClient写入响应对象之前向tcpClient.pipe(transformStream).pipe(res)添加自定义逻辑,请查看Transform stream。然后你必须:

  • 使用自定义转换逻辑
  • 创建转换流
  • 将所有流组合在一起:{{1}}。