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

时间:2016-10-22 17:11:28

标签: java sockets networking stream 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

1 个答案:

答案 0 :(得分:-1)

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