我正在 Node 中实现一个 tcp 协议(protocol)。
完整来源:
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 数据包。
这行不通。
SO上有更多关于这个的问题,但是他们建议使用分隔符。
但由于我无法更改协议(protocol),所以这不是一个选项。
没有简单的方法来冲洗 socket 吗?
socket.setNoDelay() 没有帮助。
编辑:我也尝试过使用 drain 事件发送下一次写入,但从未调用过该事件?
更新:
这似乎解决了问题,但非常丑陋,如果它总是有效,我现在不这样做。
我没有直接写入它,而是写入缓冲区:
this.writeFILO.push(buf);
每个周期(?)我都在向套接字流写入一个包:
var sendCycle = function(ads) {
if (ads.writeFILO.length > 0) {
ads.tcpClient.write(ads.writeFILO.shift());
}
setTimeout(function() {
sendCycle(ads);
}, 0);
}
最佳答案
我指的是 the socket.write(data, [encoding], [callback])
API :
The optional callback parameter will be executed when the data is finally written out - this may not be immediately.
因此,设置一个队列(数组很好)来保存要发送的消息。
当调用上述回调时,检查队列并在需要时发送..
然而,这不能保证您正在寻找什么,您必须进行测试。不幸的是,当远程端点确认它实际收到该消息时,文档没有明确说明......
最后,正如您得出的结论,TCP 是一个流。
我现在想到一个有趣的想法,但是,如果您被迫使用现有协议(protocol),那么打开两个 TCP 连接。
当一个连接确认(无论更高级别的协议(protocol)是什么)收到该消息时,通过另一个连接发送下一个......等等......
无论如何,不错的挑战:)
关于Node.js 写入后刷新套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22414353/