gpt4 book ai didi

node.js - Node : Never emits "end" when reading a TCP Socket

转载 作者:搜寻专家 更新时间:2023-10-31 23:53:50 25 4
gpt4 key购买 nike

我是 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);
};

最佳答案

end事件会处理TCP协议(protocol)的FIN包(换句话说:会处理close包)

事件:'结束'#

Emitted when the other end of the socket sends a FIN packet. By default (allowHalfOpen == false) the socket will destroy its file descriptor once it has written out its pending write queue. However, by setting allowHalfOpen == true the socket will not automatically end() its side allowing the user to write arbitrary amounts of data, with the caveat that the user is required to end() their side now.

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

解决方案

我了解您的问题,网络通信存在一些数据传输间隙,并且它将您的消息拆分为一些包。您只想阅读您的全部内容。

为了解决这个问题,我建议您创建一个协议(protocol)。只需在连接消息的大小小于消息总大小之前发送一个包含消息大小的数字,继续连接 :)

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

希望对你有帮助:)

关于node.js - Node : Never emits "end" when reading a TCP Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31088497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com