gpt4 book ai didi

javascript - Node.js TCP 服务器传入缓冲区

转载 作者:可可西里 更新时间:2023-11-01 02:31:09 27 4
gpt4 key购买 nike

我有两个相互通信的 Node 进程。我将它们称为[Node Server][Node Sender][Node Sender] 持续处理信息并通过 TCP 连接将消息写入 [Node Server][ Node 服务器]然后写回一条状态消息。

[ Node 发送者]示例:

var message = "Test Message";
[Node Sender].connection.write(message);

[ Node 服务器]示例:

[Node Server].socket.on("data", function(p_data) {
this.write("OK");

// Do some work with p_data
}

这没有问题,p_data 总是包含 “测试消息” 以超过 5 毫秒的速度发送。但是,如果我加速[Node Sender]每毫秒写入一次,p_data 偶尔会以类似“Test MessageTest MessageTes” 的方式结束。。 p>

我知道 [Node Sender] 中的缓冲区填充速度可能比写入命令发送它的速度快。有没有办法在发送消息时强制一对一的比例,同时仍然保持异步?

我当然可以在我的消息中添加一个终止符,然后在 [Node Server] 中填充一个缓冲区,但我想确保没有明显遗漏的东西。

最佳答案

不,您没有遗漏任何东西,是的,您确实需要在消息中添加某种形式的终止。

这里有两个基本问题:

  1. TCP协议(protocol)是面向流的,而不是面向消息的;它没有关于什么可能构成“消息”的内在知识。

  2. node.js 网络库触发的数据事件表明 一些 数据已经到达,但不知道消息可能包含什么,它不能表明它已经收到任何特定的数据。

因此,通过比 Node 处理消息更快的速度发送消息,套接字接收缓冲区会充满多个“消息”。

这个问题的典型解决方案是添加行终止,可以在 https://github.com/baudehlo/Haraka/blob/master/connection.js在第 32-34 行:

self.client.on('data', function (data) {
self.process_data(data);
});

和第 110-134 行:

Connection.prototype.process_data = function (data) {
if (this.disconnected) {
logger.logwarn("data after disconnect from " + this.remote_ip);
return;
}

this.current_data += data;
this._process_data();
};

Connection.prototype._process_data = function() {
var results;
while (results = line_regexp.exec(this.current_data)) {
var this_line = results[1];
if (this.state === 'pause') {
this.early_talker = 1;
var self = this;
// If you talk early, we're going to give you a delay
setTimeout(function() { self._process_data() }, this.early_talker_delay);
break;
}
this.current_data = this.current_data.slice(this_line.length);
this.process_line(this_line);
}
};

关于javascript - Node.js TCP 服务器传入缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5955498/

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