写入后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()