写入后Node.js刷新套接字

我正在Node中实现一个tcp协议。

完整来源:
https://github.com/roelandmoors/ads.js/blob/master/ads.js

眼镜:
http://infosys.beckhoff.com/content/1033/tcadsamsspec/html/tcadsamsspec_amstcppackage.htm?id=17754

问题是我用这个来发送一个包:

this.tcpClient.write(buf); 

如果我发送多个命令,那么多个命令合并成一个单独的tcp数据包。
这不起作用。

关于这个问题还有更多的问题,但是他们build议使用一个分隔符。
但是因为我不能改变协议,所以这不是一个选项。

没有一个简单的解决scheme来刷新套接字?

socket.setNoDelay()没有帮助。

编辑:我也尝试使用排水事件发送下一个写,但事件永远不会被调用?

更新:

这似乎解决了这个问题,但是非常糟糕,而且现在如果它总是有效的话。
而不是直接写入我写入缓冲区:

 this.writeFILO.push(buf); 

每个周期(?)我正在写封装到套接字stream:

 var sendCycle = function(ads) { if (ads.writeFILO.length > 0) { ads.tcpClient.write(ads.writeFILO.shift()); } setTimeout(function() { sendCycle(ads); }, 0); } 

我指的是socket.write(data, [encoding], [callback]) API :

数据最终写出时,将执行可选的callback参数 – 这可能不会立即生效。

所以,build立一个队列(数组很好),它包含要发送的消息。
当上述callback被调用时,检查队列并在需要时发送。

然而,这并不能保证你在找什么,你必须testing。 不幸的是,文档没有明确说明何时从远程端点得到确认,确实收到了该消息。

最后,正如你所总结的那样,TCP是一个stream

一个有趣的想法,现在刚刚提出,但是,如果你被迫使用现有的协议,然后打开两个TCP连接。
当一个连接接收到这个消息时(不pipe更高级的协议是什么),通过另一个连接发送下一个…等等。

无论如何,好挑战:)

我知道这是一个老问题,我不是100%确定我明白你在找什么,但有一种方法可以在节点中刷新套接字。 首先你需要实现一个Transform类。

请参阅https://nodejs.org/api/stream.html#stream_implementing_a_transform_stream

然后,你可以把你的stream和pipe道通过你的转换,然后将其pipe道插入你的sockets。

我没有这个节点模块,但是我在这里看到了一个例子: https : //github.com/yongtang/clamav.js/blob/master/index.js#L8

我错了。 TCP是一个stream,协议像stream一样工作,但我没有像stream一样处理它。

PS:发送单独的消息似乎与setImmediate()