【问题标题】:How do i determine the end-of-input from netcat?我如何确定来自 netcat 的输入结束?
【发布时间】:2016-10-22 17:11:28
【问题描述】:

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

一旦打开了一个套接字,我就会得到一个这样的 InputStream:

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

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

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

这在处理文件时工作得很好,但在我的情况下,一旦 netcat 不再接收任何输入,read 就会阻塞,我必须终止 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

【问题讨论】:

  • 正在确定它。但你没有得到它。 netcat 没有关闭连接,所以你永远不会从read() 得到-1。问题不在这里,而在于您如何使用netcat
  • 恩,请赐教如何正确使用netcat
  • 好吧,请告诉我们您是如何使用netcat 的,我们或许可以从某个地方开始。

标签: java sockets networking stream netcat


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 2016-12-23
    • 2017-11-16
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多