2016-10-22 3 views
0

Ich versuche ein kleines Programm zu erstellen, das Verbindungen akzeptiert und einfach alles, was es empfängt, an eine Datei abgibt. Auf diese Weise kann ich Dinge einfach in netcat puffern, die alles, was sie auf stdin empfängt, an meine ServerSocket sende. Hier ist, was ich getan habe:Wie ermittle ich das Ende der Eingabe von Netcat?

Wenn ein Socket geöffnet wurde ich hole mir einen Inputstream wie folgt aus:

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

Jetzt versuche ich, alles von diesem Eingang zu lesen, schreiben Sie eine URL zurück und schließen Sie die Verbindung. Aber wie kann ich feststellen, wann das Skript beendet wurde? Vorstellung DuckDuckGo führen zu Ergebnissen wie folgt aus:

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

Das funktioniert völlig in Ordnung, wenn Dateien Handhabung, aber in meinem Fall Lese wird einmal netcat blockiert nicht mehr Eingang empfangen, und ich habe netcat zu beenden, die die tatsächlich erlaubt Code, um fortzufahren, aber ich kann nichts mehr zurücksenden, weil der Sockel geschlossen ist.

Ich habe weitere Tests und kippte den Inhalt des Puffers (diesmal nur ein 8-Byte-Puffer; i eine Zählung war kochend (oben) in netcat), die in dieser (Hexdumps) ergab:

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 

Und sobald der Countdown beendet war, steckte es bei read() wieder fest. Die Verwendung von InputStream#available() scheint bei verzögerter Eingabe ebenfalls nicht zuverlässig zu sein.

Edit: Ich netcat wie folgt aus:

countup.sh | nc localhost 9999 

countup.sh:

for i in {1..10} 
do 
    sleep 1 
    echo $i 
done 
+0

Sie * sind * bestimmen es. Aber du bekommst es nicht. 'netcat' schließt die Verbindung nicht, so dass Sie nie -1 von' read() 'bekommen. Das Problem ist nicht hier, es ist in wie Sie 'netcat' verwenden. – EJP

+0

Nun, erleuchte mich auf netcat richtig zu verwenden – Yamakaja

+0

Nun, erleuchte uns wie Sie, wie Sie bereits 'netcat' verwenden und wir könnten irgendwo von Anfang an haben. – EJP

Antwort

-1

ich nicht einen Weg aber zu erraten, wenn der Eingang finden konnten, endet so Ich habe gerade meinen eigenen Client geschrieben, der die Eingabe mit einer NUL beendet (ich bin nur mit Text beschäftigt)

Verwandte Themen