Hallo zusammen,
bei meinem Chat Programm habe ich das Problem, dass der Benutzer des Clients über die Konsole Nachrichten verschicken soll, gleichzeitig aber natürlich auch ein BufferedReader auf Nachrichten vom Server warten soll.
Mein Grundgedanke war nun folgender:
Ein Thread wartet in einer Endlosschleife nur auf Eingaben des Client-Benutzers, ein anderer Thread wartet auf eingehende Nachrichten des Servers und unterbricht im Falle einer Nachricht den ersten Thread. Bei der Umsetzung haperts allerdings noch
Da die Methode interrupt() so weit ich weiß, ja keine blockierenden Input/Output - Methoden abbricht, musste eine andere Lösung her.
Deshalb wechseln sich die Thread in meiner momentanen Lösung nur ab, ohne dass der eine den anderen unterbricht. Es funktioniert zwar, aber zufrieden bin ich nicht wirklich.
Hier der relevante Quellcode:
Klasse Client:
Klasse MessageListener:
Viele Grüße
Florian
PS: Mir ist bewusst, dass die Nachrichten momentan nur an die Konsole geschickt werden und nicht an den Server, dient allerdings nur zu Testzwecken.
Edit: In der Client-Klasse hatte sich durch schlampiges Kopieren ein Fehler im Konstruktor eingeschlichen, ist jetzt behoben, sorry dafür.
bei meinem Chat Programm habe ich das Problem, dass der Benutzer des Clients über die Konsole Nachrichten verschicken soll, gleichzeitig aber natürlich auch ein BufferedReader auf Nachrichten vom Server warten soll.
Mein Grundgedanke war nun folgender:
Ein Thread wartet in einer Endlosschleife nur auf Eingaben des Client-Benutzers, ein anderer Thread wartet auf eingehende Nachrichten des Servers und unterbricht im Falle einer Nachricht den ersten Thread. Bei der Umsetzung haperts allerdings noch
Da die Methode interrupt() so weit ich weiß, ja keine blockierenden Input/Output - Methoden abbricht, musste eine andere Lösung her.
Deshalb wechseln sich die Thread in meiner momentanen Lösung nur ab, ohne dass der eine den anderen unterbricht. Es funktioniert zwar, aber zufrieden bin ich nicht wirklich.
Hier der relevante Quellcode:
Klasse Client:
Java:
public class Client extends Thread {
BufferedReader in;
PrintWriter out;
Socket socket;
public Client(String host, int port) {
try {
socket = new Socket(host, port);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
} catch (UnknownHostException ex) {
} catch (IOException ex) {
}
}
public void run() {
Scanner sc = new Scanner(System.in);
while (true) {
String message = sc.nextLine();
System.out.println(message);
}
}
public static void main(String[] args) {
Client c = new Client("127.0.0.1", 7575);
MessageListener ml = new MessageListener(c.in);
c.start();
}
}
Klasse MessageListener:
Java:
class MessageListener extends Thread {
BufferedReader in = null;
public MessageListener(BufferedReader in) {
this.in = in;
this.start();
}
@Override
public void run() {
while (true) {
try {
if (in.ready()) {
String message = in.readLine();
System.out.println(message);
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
} catch (IOException ex) {
}
}
}
}
Viele Grüße
Florian
PS: Mir ist bewusst, dass die Nachrichten momentan nur an die Konsole geschickt werden und nicht an den Server, dient allerdings nur zu Testzwecken.
Edit: In der Client-Klasse hatte sich durch schlampiges Kopieren ein Fehler im Konstruktor eingeschlichen, ist jetzt behoben, sorry dafür.
Zuletzt bearbeitet: