首页 > 解决方案 > 输入流结束后如何写入套接字?

问题描述

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

标签: node.jssockets

解决方案


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


推荐阅读