Hallo ihr!
Habe ein kleines Problem, das wohl sehr gut in die Thematiken Sockets, Streams und Casting passt.
Da ich noch in den Startlöchern der (Java-)Programmierung stehe, weiß ich mir - selbst nach langem Googeln und Foren-Lesen - nicht wirklich zu helfen. Nun aber zu meinem Problem:
Ich möchte einen Clienten basteln, der eine Verbindung zu einem bereits bestehenden Programm (Server) aufbauen soll. Der Server gibt nach dem Verbindungsaufbau sofort eine Nachricht zurück, die eine fünfzeilige Länge hat. Der Client soll diese Nachricht sofort abfangen und ausgeben. Soweit ist das ja alles kein Problem und das Grundprinzip habe ich nun bereits auf mehreren Wegen durchprobiert. Hier mal das simple Beispiel mit einem char[]:
Das Problem, das ich mit dem char[] habe, ist, dass es eine vordefinierte Größe hat und somit Rückmeldungen vom Server, die einen Zeichensatz von über 200 Zeichen beinhalten, nicht mehr vollständig ausgibt (ansonsten läuft das Programm ohne Fehler).
Nun habe ich versucht das Ganze so umzuschreiben, dass der InputStream komplett ausgelesen wird ohne eine vordefinierte Anzahl an Zeichen, die nur ausgelesen werden sollen/können. Meine Versuche ergaben folgendene Codebeispiele:
Casting to Char ohne die vordefinierte Buffer-Größe:
Bei diesem Beispiel bleibt er am Ende des Streams hängen, wo er theoretisch doch -1 zurückgeben und die while-Schleife verlassen müsste.
readLine()-Beispiel:
Bei diesem Beispiel bleibt er ebenfalls hängen und zwar in der letzten Zeile, wo sich auch das Stream-Ende befindet. Dennoch befindet sich Text in der letzten Zeile, der aber nicht mehr ausgegeben wird.
Scanner-Beispiel:
Hier passiert genau das Selbe wie im readLine()-Beispiel.
Nun frage ich euch, was mache ich falsch, dass er ständig am Ende des Streams hängen bleibt, aber im ersten char[]-Beispiel den kompletten Stream in den char[]-Buffer einliest und dann das Programm ohne hängen zu bleiben beendet?
Ich würde den InputStream gerne komplett auslesen können, ohne dabei eine vordefinierte Menge als Buffer einsetzen zu müssen. Die Möglichkeit das Problem mittels Threading zu umgehen, indem man mit einem weiteren Thread das Hängenbleiben abfängt und folglich mit einem Timeout beendet, möchte ich ebenfalls nicht in Betracht ziehen.
Ich hoffe, ich habe nichts vergessen zu posten, das bei der Lösung des Problems behilflich sein könnte und bin nun gespannt auf eure Postings.
Gruss
Luni
Habe ein kleines Problem, das wohl sehr gut in die Thematiken Sockets, Streams und Casting passt.
Da ich noch in den Startlöchern der (Java-)Programmierung stehe, weiß ich mir - selbst nach langem Googeln und Foren-Lesen - nicht wirklich zu helfen. Nun aber zu meinem Problem:
Ich möchte einen Clienten basteln, der eine Verbindung zu einem bereits bestehenden Programm (Server) aufbauen soll. Der Server gibt nach dem Verbindungsaufbau sofort eine Nachricht zurück, die eine fünfzeilige Länge hat. Der Client soll diese Nachricht sofort abfangen und ausgeben. Soweit ist das ja alles kein Problem und das Grundprinzip habe ich nun bereits auf mehreren Wegen durchprobiert. Hier mal das simple Beispiel mit einem char[]:
Java:
public static void main(String args[]) throws Exception {
Socket client = new Socket("localhost", 4242);
System.out.println("Connected...");
System.out.println("------------");
Thread.sleep( 1000 );
InputStreamReader in = new InputStreamReader( client.getInputStream() );
//BufferedReader in = new BufferedReader( new InputStreamReader( client.getInputStream() ) );
while ( !in.ready() ) {
Thread.sleep(100);
}
char[] buffer = new char[200];
int number = in.read(buffer, 0, buffer.length);
String msg = new String(buffer, 0, number);
System.out.println( msg );
in.close();
client.close();
System.out.println("---------------");
System.out.println("Disconnected...");
}
Das Problem, das ich mit dem char[] habe, ist, dass es eine vordefinierte Größe hat und somit Rückmeldungen vom Server, die einen Zeichensatz von über 200 Zeichen beinhalten, nicht mehr vollständig ausgibt (ansonsten läuft das Programm ohne Fehler).
Nun habe ich versucht das Ganze so umzuschreiben, dass der InputStream komplett ausgelesen wird ohne eine vordefinierte Anzahl an Zeichen, die nur ausgelesen werden sollen/können. Meine Versuche ergaben folgendene Codebeispiele:
Casting to Char ohne die vordefinierte Buffer-Größe:
Java:
int x, y = 0;
while ( ( x = in.read() ) != -1 ) {
System.out.print( (char)x + "("+ y++ +")" );
}
readLine()-Beispiel:
Java:
String line;
while ( ( line = in.readLine() ) != null ) {
System.out.println( line );
}
Scanner-Beispiel:
Java:
Scanner scanner = new Scanner( conn.getInputStream() );
while ( scanner.hasNextLine() ) {
System.out.println( scanner.nextLine() );
}
scanner.close();
Nun frage ich euch, was mache ich falsch, dass er ständig am Ende des Streams hängen bleibt, aber im ersten char[]-Beispiel den kompletten Stream in den char[]-Buffer einliest und dann das Programm ohne hängen zu bleiben beendet?
Ich würde den InputStream gerne komplett auslesen können, ohne dabei eine vordefinierte Menge als Buffer einsetzen zu müssen. Die Möglichkeit das Problem mittels Threading zu umgehen, indem man mit einem weiteren Thread das Hängenbleiben abfängt und folglich mit einem Timeout beendet, möchte ich ebenfalls nicht in Betracht ziehen.
Ich hoffe, ich habe nichts vergessen zu posten, das bei der Lösung des Problems behilflich sein könnte und bin nun gespannt auf eure Postings.
Gruss
Luni