Node.js 写入后刷新套接字

标签 node.js sockets tcp

我正在 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/

相关文章:

javascript - 如何在 Node.js 服务器上加载图像?

azure - 我的 Azure 云服务上出现奇怪的 TCP 连接(每 25 秒一次)

flask - 寻找使用Flask API发送TCP重置以发送选择性URL的方法

javascript - 如何在登录和注册社交之间制定不同的宣誓流程?像谷歌oauth2.0使用passport js

javascript - 是否可以使用 Javascript API 拖动 Chrome 窗口?

node.js - 在 Jenkins 中运行时,NPM 测试神秘地卡住了

sockets - Python错误: Can't convert bytes to string implicitly

c++ - C++ 中的 Winsock 服务器在三个客户端后拒绝连接

javascript - 坚持使用自定义过滤器获取实时数据的方法

sockets - 在 macos 上通过命令行发送 TCP 消息