我是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);
};
答案 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
我希望它有所帮助:)