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

我对Node.Js很新,我使用tcp套接字与客户端进行通信。 由于收到的数据是零碎的,我注意到它不止一次地向控制台输出“ondata”。 我需要能够读取所有的数据并将其连接起来以实现其他function。 我读了下面的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); }; 

结束事件将处理TCP协议的FIN包(换言之:将处理closures包)

事件:'结束'#

当套接字的另一端发送FIN数据包时发出。 默认情况下(allowHalfOpen == false),套接字一旦写出了挂起的写入队列就会销毁它的文件描述符。 但是,通过设置allowHalfOpen == true,套接字不会自动结束()它允许用户写入任意数量的数据,同时要求用户现在终止()他们的一方。

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

解决scheme

我了解你的问题,networking通信有一些数据传输的空白,它在一些包中分割你的消息。 你只是想读完整的内容。

为了解决这个问题,我会build议你创build一个协议 。 只要发送一个号码与你的消息的大小之前,而你的连接消息的大小小于你的消息大小的总和,保持连接:)

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

我希望它有助于:)