【发布时间】: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