【发布时间】:2020-04-10 00:31:12
【问题描述】:
我对在 Node JS 中分叉 TCP 客户端有疑问。这是场景。
- 客户端将连接到服务器(建立?)。
- 客户端将第一条消息写入服务器。
- 客户端将第二条消息写入服务器。
- “写入”方法将无限循环,延迟 5 秒。
- 点号 1-4 将被分叉并创建一个新的 TCP 连接(与以前不同),延迟 8 秒。
这是我目前的做法。
// tcp_client.js
const cluster = require('cluster')
if (cluster.isMaster) {
for (let i = 0; i < 2; i += 1) {
setTimeout(() => {
cluster.fork()
}, 8000) // I expect this will delay between one and another fork
}
} else {
console.log(`Connected on ${process.pid}`)
require('./sender').send()
}
cluster.on('exit', (worker) => {
console.log('server',`Worker %d died :( ${worker.id}`);
cluster.fork();
})
// sender.js
const net = require('net')
const send = () => {
const client = new net.Socket()
client.connect(8090, 'localhost', () => {
const firstMessage = 'first_message'
const secondMessage = 'second_message'
const write = function () {
client.write(firstMessage)
/*
The reason why I'm using setTimeout() is because if I write it as
`client.write(firstMessage)
client.write(secondMessage)`
The second message won't be sent. Is there any better methods?
*/
setTimeout(() => {
client.write(secondMessage)
}, 1);
}
setTimeout(write, 5000) // I expect this will loop infinitely
})
}
module.exports = { send }
当我运行代码时,fork 不会延迟,消息也不会循环。有什么解决办法吗?谢谢。
【问题讨论】:
-
您的集群循环仅在 8 秒后安排两个
cluster.fork()调用。它不会在 8 秒内执行一次,然后再过 8 秒。不确定这是否与您的要求有关。 -
您最初是从
connect事件处理程序内部调用setTimeout(write, 5000),但您在write()函数本身中没有这些处理程序之一,因此它不会重复。跨度> -
另外,连续进行两次
client.write()调用是完全可以的——两者都会被发送。但是,TCP 可能会将它们组合成同一个数据包。 TCP 是流协议,而不是基于消息的协议。因此,要描述消息之间的差异,您必须解析流。例如,在这种情况下,您可以在每条消息的末尾放置一个\n,并在读取 TCP 流时将其用作消息分隔符。
标签: javascript node.js networking tcp fork