我正在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包 这不起作用。
关于此问题还有更多问题,但他们建议使用分隔符 但由于我无法改变协议,因此这不是一种选择。
是否有一个简单的解决方案来刷新套接字?
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);
}
答案 0 :(得分:2)
我指的是the socket.write(data, [encoding], [callback])
API:
当最终写出数据时,将执行可选的回调参数 - 这可能不会立即执行。
因此,设置一个队列(数组很好),它保存要发送的消息 当调用上述回调时,检查队列并在需要时发送..
然而不保证您正在寻找的内容,您必须进行测试。不幸的是,当远程端点确认它实际收到该消息时,文档并没有明确说明...
最后,正如您所总结的那样,TCP是流。
现在我想到了一个有趣的想法,如果您强制要求使用现有协议,那么打开两个TCP连接。
当一个连接确认(无论更高级别的协议是什么)接收该消息时,通过另一个连接发送下一个...等等......
无论如何,好挑战:)
答案 1 :(得分:1)
我知道这是一个老问题,而且我并不是100%确定我理解你在寻找什么,但有一种方法可以在节点中刷新套接字。首先,您需要实现Transform类。
请参见此处:https://nodejs.org/api/stream.html#stream_implementing_a_transform_stream。
然后你可以把你的流和管道传输到你的转换器中,然后再将它输送到你的插座中。
我没有这个节点模块,但我在这里看到了一个例子:https://github.com/yongtang/clamav.js/blob/master/index.js#L8
答案 2 :(得分:0)
我错了。 TCP是一个流,协议的工作方式类似于流,但我没有像流那样处理它。
PS:发送单独的消息似乎与setImmediate()
一起使用