2016-10-22 78 views
0

我正在尝试创建一个小程序,它接受连接并将所收到的所有内容转储到文件中。通过这种方式,我可以将东西传递给netcat,将netdin收到的所有东西发送到我的ServerSocket。下面是我做的:如何确定netcat的输入结束?

一旦插座已经打开我让自己的InputStream这样的:

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

现在,我想读一切事情,从输入,写回一个网址,并关闭连接。但是,我如何确定脚本何时完成? 问duckduckgo导致的结果是这样的:

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

处理文件时,此工作完全正常,但在我的情况下,read将被阻塞的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

您*正在*确定它。但是你没有*得到它。 'netcat'没有关闭连接,所以你从不会从'read()'得到-1。问题不在这里,而在于你如何使用'netcat'。 – EJP

+0

那么,启发我如何正确使用netcat – Yamakaja

+0

那么,启发你我们,你已经如何使用'netcat',我们可能有一个地方可以从头开始。 – EJP

回答

-1

我无法找到一个方法,但猜测当输入结束,因此我只写了我自己的客户端,终止NUL的输入(我只处理文本)