写入后,Node.js刷新套接字

时间:2014-03-14 19:43:22

标签: node.js sockets tcp

我正在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);
}

3 个答案:

答案 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()

一起使用
相关问题