node.js - 输入流结束后如何写入套接字?
问题描述
我正在尝试编写一个非常简单的节点 TCP 服务器,它读取完整的输入流并写出输入的一些功能。如果没有完整的输入,就无法生成输出,因此当输入进入时,写入无法流式传输。为简单起见,在这篇文章中,我省略了输入的实际转换,只是写回输入。
我最初的尝试是在end
事件处理程序中编写:
const net = require('net');
const server = net.createServer(async client => {
let data = '';
client.on('end', () => {
client.write(data);
});
client.on('data', part => {
data += part.toString();
});
client.pipe(client);
});
server.listen(8124);
但这会导致Socket.writeAfterFIN
错误“此套接字已被另一方结束”,这导致我启用allowHalfOpen
,因为文档似乎表明它将传入和传出FIN
数据包分开。
const net = require('net');
const drain = client =>
new Promise(resolve => {
let data = '';
client.on('end', () => {
console.log('end');
resolve(data);
});
client.on('data', part => {
console.log('data');
data += part.toString();
});
});
const server = net.createServer({ allowHalfOpen: true }, async client => {
const req = await drain(client);
client.end(req);
});
server.listen(8124);
这在我使用 eg 时有效echo 'abc' | nc localhost 8124
,但我不确定allowHalfOpen
这里是否需要。在输入流结束后不久还有另一种写法吗?
解决方案
使用 netcat 而不是curl
解决问题。例如echo 'abc' | nc localhost 8124
。这也更符合我无论如何都需要做的事情,因为我不需要此服务器的 HTTP。
推荐阅读
- xml - 如何编写 build.xml,它将为单个 XML 文件提供两个目标/任务,该文件使用两个 XSLT 文件提供两个输出文件?
- c++ - qmake:检测目标位宽(32 位或 64 位)
- java - 多模块 Spring Boot 应用程序立即关闭
- textbox - 文本框值到数据库
- r - ggplot y轴调整和统计
- php - 如何使用 php 从文本区域中删除 \r\n\r\n
- angular - 无法绑定到“名称”,因为它不是“ng-multiselect-dropdown”的已知属性
- r - 排除某些列在 R 中添加后缀
- python - tf.string_input_producer 即使在将 epoch 设置为大于 1 后也会给出单个 epoch
- java - 为什么 G1 垃圾收集器的卸载时间会随着时间的推移而增加?