NodeJs:读取TCP套接字时从不发出“结束”

时间:2015-06-27 12:00:10

标签: node.js sockets

我是Node.Js的新手,我正在使用tcp套接字与客户端进行通信。由于收到的数据是碎片的,我注意到它不止一次地将“ondata”打印到控制台。我需要能够读取所有数据并将其连接起来以实现其他功能。我阅读了以下http://blog.nodejs.org/2012/12/20/streams2/,并认为我可以将socket.on('end',...)用于此目的。但它永远不会在控制台上打印“结束”。

这是我的代码:

Client.prototype.send = function send(req, cb) {
    var self = this;

    var buffer = protocol.encodeRequest(req);
    var header = new Buffer(16);
    var packet = Buffer.concat([ header, buffer ], 16 + buffer.length);

    function cleanup() {
       self.socket.removeListener('data', ondata);
       self.socket.removeListener('error', onerror);
    }

    var body = '';

    function ondata() {
    var chunk = this.read() || '';
       body += chunk;
       console.log('ondata');
    }

    self.socket.on('readable', ondata);

    self.socket.on('end', function() {
        console.log('end');
    });

   function onerror(err) {
      cleanup();
      cb(err);
   }

   self.socket.on('error', onerror);
   self.socket.write(packet);
};

1 个答案:

答案 0 :(得分:2)

结束事件将处理TCP协议的FIN包(换句话说:将处理close包)

事件:'结束'#

  

当套接字的另一端发送FIN数据包时发出。   默认情况下(allowHalfOpen == false)套接字将在写出其挂起的写入队列后销毁其文件描述符。但是,通过设置allowHalfOpen == true,套接字不会自动end()允许用户写入任意数量的数据,但需要警告用户现在必须结束()。

关于FIN套餐:https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination

解决方案

我理解你的问题,网络通信有一些数据传输空白,它会在一些包中分割你的消息。您只想阅读完整内容。

要解决此问题,我建议您创建协议。只需发送一个包含邮件大小的数字,然后在连接邮件的大小小于邮件大小的总和时,请保持连接:)

我昨天创建了一个lib来简化这个问题:https://www.npmjs.com/package/node-easysocket

我希望它有所帮助:)