我如何确定 netcat 的输入结束?

How do i determine the end-of-input from netcat?

我正在尝试创建一个小程序来接受连接并将它接收到的所有内容转储到一个文件中。这样我就可以将东西通过管道传输到 netcat 中,netcat 将它在 stdin 上接收到的所有内容发送到我的 ServerSocket。这是我所做的:

打开套接字后,我会得到一个像这样的 InputStream:

Socket socket = serverSocket.accept();
InputStream inputStream = new BufferedInputStream(socket.getInputStream());

现在我正在尝试从该输入中读取所有内容,写回 URL 并关闭连接。但是我如何确定脚本何时完成? 询问 duckduckgo 会得到这样的结果:

byte[] buffer = new byte[1024];
int count;
while((count = inputStream.read(buffer) > 0) {
    outputStream.write(buffer,0,count);
}

这在处理文件时工作得很好,但在我的例子中,一旦 netcat 不再接收到任何输入,读取将被阻止,我必须终止 netcat,这实际上允许代码继续,但我无法发送任何东西因为套接字关闭了。

我做了进一步的测试并转储了缓冲区的内容(这次只有一个 8 字节的缓冲区;我正在将一个计数(向上)传送到 netcat),结果是(hexdumps):

Bytes read: 2 Last byte: 0A
31 0A 00 00 00 00 00 00
Bytes read: 2 Last byte: 0A
32 0A 00 00 00 00 00 00
Bytes read: 2 Last byte: 0A
33 0A 00 00 00 00 00 00

.....

Bytes read: 3 Last byte: 0A
31 30 0A 00 00 00 00 00

倒计时结束后,它再次卡在 read() 处。 在处理延迟输入时,使用 InputStream#available() 似乎也不可靠。

编辑: 我像这样使用 netcat

countup.sh | nc localhost 9999

countup.sh:

for i in {1..10}
do
    sleep 1
    echo $i
done

我找不到办法只能猜测输入何时结束所以我只写了我自己的客户端以 NUL 终止输入(我只处理文本)