输入流结束后如何写入套接字?

时间:2019-07-12 05:04:05

标签: node.js sockets

我正在尝试编写一个非常简单的节点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。输入流结束后是否还有另一种写方法?

1 个答案:

答案 0 :(得分:0)

使用netcat代替curl可解决此问题。例如echo 'abc' | nc localhost 8124。无论如何,这也更符合我的需要,因为我不需要此服务器的HTTP。