我正在尝试创建一个接受连接的小程序,并将收到的所有内容转储到文件中。通过这种方式,我可以将内容传输到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
答案 0 :(得分:-1)
我找不到方法,但猜测输入何时结束,所以我只写了自己的客户端,用NUL终止输入(我只处理文本)