我正在尝试编写一个非常简单的节点TCP服务器,该服务器读取完整的输入流并写出输入的某些功能。没有 full 输入就无法生成输出,因此在输入进入时就无法流式传输写入内容。为简单起见,在这篇文章中,我省略了输入的实际转换,只是回写了输入。
我最初的尝试是在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
,因为the docs似乎表明它将输入的和传出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);
当我使用例如echo 'abc' | nc localhost 8124
,但是我不确定这里是否需要allowHalfOpen
。输入流结束后是否还有另一种写方法?
答案 0 :(得分:0)
使用netcat代替curl
可解决此问题。例如echo 'abc' | nc localhost 8124
。无论如何,这也更符合我的需要,因为我不需要此服务器的HTTP。