Linux Console und Java Applikationen

Guten Morgen liebes Forum!

Wie Ihr wahrscheinlich schon mitbekommen habt, kaue ich momentan ein Fernstudium zum Software-Entwickler durch, in dem natürlich auch die komplette Java-Geschichte enthalten ist. Nun habe ich ein kleines Problemchen mit der Console unter Linux - genauer gesagt Ubuntu 10.04. Erstelle ich Applets, die parallel zu Ihrer Ausführung auf Consoleneingaben warten sollen, bzw. von dieser NACH dem Start Tastatureingaben entgegen nehemen sollen, so funktioniert die Eingabe und deren Auswertung unter Windows (also der Eingabeaufforderung) reibungslos, während unter Ubuntu der Cursor zwar fröhlich meine Eingabe entgegennimmt, aber bei einfach nur eine Zeile nach unten springt, ohne die Eingabe an das laufende Programm zu übergeben und dementsprechende Reaktionen hervorzurufen.

Ich arbeite unter anderem mit Eclipse während der Entwicklung - einfach weil es ein netter Lehrmeister ist und Tips gibt. Starte ich meine Programme dort, so kann ich die Eingaben ohne Probleme in der “eingebauten” Shell durchführen und der Code funktioniert wie gewünscht. Nur, wie gesagt, gehe ich über die Console, funktioniert die Geschichte nur unter Windows, nicht aber unter Linux.

Wie verhält sich nun die Console zu laufenden Programmen? Gibt es etwas was ich als Benutzer (ich arbeite ja nicht als Root logischerweise) im Betriebssystem einstellen muss, damit korrekt laufende Java-Programme - die ja unter der aktiven Console gestartet wurden, diese Eingaben entgegen nehmen dürfen?

PS: Ups, ich seh grad ich bin unter die Kategorie NEWS gerutscht? sry, das sollte unter Betriebssysteme gepostet werden…

[QUOTE=Gecko]
PS: Ups, ich seh grad ich bin unter die Kategorie NEWS gerutscht? sry, das sollte unter Betriebssysteme gepostet werden…[/QUOTE]

Kein Problem - verschoben.

ich hab mir das jetzt durchgelesen und keine Ahnung was du meinst :smiley:
im Zweifel zeig mal was du eingibst um das Programm zu starten

Ich habe erst überlegt noch mal ein Beispiel zu schreiben, aber inzwischen hat sich folgendes ergeben:

a) Ein hier bereits bekanntes Beispiel ist yampis Chat-Programm, welches wir beide zufällig in unterschiedlichen Kursen vorgelegt bekommen haben. Dort tritt das Problem auf. Die Klasse Chat-Server nimmt nur unter Windows Tastatureingaben entgegen nachdem sie gestartet wurde, da der HauptThread unter Linux - der auf die Anmeldung der Clients wartet - anscheinend die Konsole irgendwie blockiert.

b) Ich habe mich diesbezüglich einfach mal ganz frech an das Institut gewand und um Hilfe gebeten. Dort sagte man mir dann, das dieses Problem bereits bekannt sei, da Linux eine andere Threading-Konstruktion hat als Windows. Aber einen Lösungsvorschlag gäbe es nicht, das das Thema zu umfassend und zu kompliziert für mich als Einsteiger sei.

Somit werde ich wohl erst mal die „Grundlagen“ weiter durchkauen und mich dann - wenn ich hoffentlich etwas fitter bin :stuck_out_tongue_winking_eye: - mal ausgiebig mit dem Thread-Thema bezüglich Differenzen Windows/Linux auseinandersetzen…

Gruß Gecko

Also das kann nichts damit zu tun haben ich geh mal davon aus dass die Anwendungen ganz unterschiedlich gestartet werden.

Unter Windows hast du die Kommandos java und javaw, java blockiert nach dem Start der Anwendung bis sie beendet wird. Javaw startet die Anwendung und gibt dann die Konsole gleich wieder frei.

Unter Linux hast du nur java, willst du die Konsole danach gleich wieder haben musst du java … & eingeben damit der Prozess gleich in den “Hintergrund” geht.

Es geht ja garnicht darum, die Konsole/Eingabeaufforderung wieder frei zu bekommen. Ich poste mal die wichtigen Auszüge:

		if (args.length == 1) {
			try {
				port = Integer.parseInt(args[0]);
			} catch (NumberFormatException nfe) {
				System.out.println("Ungültige Port-Angabe! "+nfe.toString());
			}
		}
		ChatServer server = new ChatServer();
		server.start();
		StringBuffer sb;
		char c;
		String ausgabe;
		while(true) {
			sb = new StringBuffer();
			try {
				Reader in = new InputStreamReader(System.in);
				while((c=(char)in.read()) != '\r') {
					sb.append(c);
				}
			} catch (IOException ioe) {
				System.out.println(ioe.toString());
			}
			ausgabe = sb.toString();
			if (ausgabe.equals ("exit")) {
				System.out.println("Eingabe: exit erhalten!");
				server.closeAll();
			} else {
				System.out.println("\""+ausgabe+"\" wird nicht ausgewertet");
			}
		}
	}
	/**
	 * @override run() durch main der Klasse ChatServer:
	 * 
	 * Aufruf der run()-Methode automatisch über server.start();
	 * Als erstes bekommt der Server einen Port zugewiesen, der sodann
	 * von ihm überwacht wird. Nach dem Anlegen einer Thread (Client) Liste
	 * Wartet der Server mit dem Einstieg in die while-Schleife auf
	 * Anmeldung eines neuen Clients und bestätigt diese Verbindung
	 * dann mit einem Promt und der Ausgabe der Teilnehmer im Chat.
	 */
	public void run() {
		try {
			serverSocket = new ServerSocket(port);
			System.out.println("SERVER online und überwacht Port: "+port);
		} catch (IOException ioe) {
			System.out.println("ServerSocket-Fehler: "+ioe.toString());
		}
		threadList = new LinkedList<ClientThread>();//Clientliste anlegen
		try {
			//Bedingung: Anmeldung eines Clients
			while ((clientSocket = serverSocket.accept()) != null) {				
				System.out.println("Verbindung zu Socket "
						+ clientSocket.getRemoteSocketAddress()
						+ " aufgenommen");
				clientThread = new ClientThread(clientSocket, this);
				thread = new Thread(clientThread, clientThread.getThreadName());
				System.out.println("Thread: "+thread);
				System.out.println("Name: "+clientThread.getThreadName());
				threadList.add(clientThread);//Client in die Liste zufügen				
				thread.start();
				//Liste aktiver Teilnehmer an alle versenden
				//siehe JAV06N, Einsendeaufgabe Nr.:6
				generateOutput(createClientNamesString());
			}
		} catch (IOException ioe) {
			System.out.println(ioe.toString());
		}
	}```

Das Prinzip ist recht simpel, in der Main wird der Thread gestartet der mit 
```while ((clientSocket = serverSocket.accept()) != null)``` 
auf Anmeldung der Clients wartet. Die main läuft ja aber weiter und soll dann ihre Endlosschleife durchlaufen um die Eingabe "exit" entgegen zu nehmen. So einfach es klingt und auch programmiert ist, so läuft es ja auch wie gedacht unter Windows. Unter Linux funktioniert die Anmeldung und die Kommunikation der Clients auch einwandfrei, man kann richtig schön chatten. Aber die Konsole in der ich mit "java ChatServer" gestartet habe, weigert sich einfach das Eingegeben an den ChatServer weiterzugeben. Ich kann zwar "exit" eingeben, aber schließen tut sich die Anwendung trotzdem nicht.

ja ganz einfach, das hast nichts mit Threads oder so zu tun
du wartest auf ein \r, das gibt es in Linux aber nicht
Windows markiert Zeilenenden mit
Linux aber nur mit

Daher beendet sich deine Schleife nie
Nimm lieber einen BufferedReader und nimm readLine()

Aha, endlich Licht in der Sache… :smiley:
Das macht natürlich Sinn, so lernt man auch die kleinen Unterschiede. Vielleicht sollte ich den Jungs vom Institut mal ne nette Mail schreiben… :wink:
Vielen Dank!

Hmm - hat Flash für Linux eine andere Codebasis? Oder warum funktionierte der entsprechende Fehler nicht auf auf dem Linux??
Ich finds aber angenehm, dass man bei keinem der 3 Rechner direkt übers Netz reinkam, sondern “nur” über Anwendungsprogramme. Das war speziell bei früheren Windosen anders

Schmiddigrüße