Die Anwendung reagiert nicht mehr, wenn versucht wird, Text aus einem Eingabestream abzurufen

Situation

Ich habe ein Programm zum Austausch von Nachrichten zwischen zwei Computern im LAN erstellt. Ein Computer identifiziert sich als Server, während der andere ein Client ist. Beim Start muss der Benutzer den Host und den Port eines anderen Computers eingeben, wenn er als Client eine Verbindung zu diesem Computer herstellen möchte. Die Einrichtung ist sehr einfach: Sie geben Ihre Nachricht ein, drücken die Eingabetaste und sie wird auf Ihrem eigenen Bildschirm angezeigt. Danach muss Ihr Gesprächspartner auf eine Schaltfläche klicken, um die neuesten Nachrichten abzurufen, und sie sollte auf seinem Bildschirm angezeigt werden. Das geht so lange, bis jemand geht.

Problem

Das Programm wird korrekt gestartet und fragt nach den Verbindungseinstellungen. Danach starte ich die Verbindung auf beiden Computern und die Dinge scheinen in Ordnung zu sein (nachdem die Verbindung hergestellt wurde, zeigt ein Etikett an, wie Ihr Status lautet, z. B. Client oder Server (1)). Wenn ich eine Nachricht eingebe und sende, sieht es weiterhin gut aus. Die Ausgabe wird auf den Bildschirm des Absenders geschrieben, und es tritt kein unerwartetes Verhalten auf.

Wenn ich die Nachrichten auf dem anderen Computer abrufen möchte, friert das Programm vollständig ein. Keine Objekte in der GUI sind anklickbar und es wird keine Ausgabe angezeigt.

Code

Unter der Annahme, dass die Verbindung korrekt hergestellt wurde (siehe (1)), werde ich den Prozess des Sendens einer Nachricht unten skizzieren, wobei die nicht wesentlichen Teile weggelassen werden.

GuiApplication.java

private void sendMessage() {
    connection.sendMessage(message);
    showMessage(message);
}

Connection.java
public void sendMessage(String message) {
    if (isClient()) {
        client.sendMessage(message);
    } else if (isServer()) {
        server.sendMessage(message);
    }
}

Client.java
public void sendMessage(String message) {
    outbound = new PrintWriter(socket.getOutputStream(), true); // Defined outside this method
    outbound.println(message);
}

Das Senden einer Nachricht ist ziemlich unkompliziert, aber ich wollte sie einschließen, nur für den Fall, dass ich etwas übersehen habe.

Was folgt, ist der Code, den ich erstellt habe, um die neuen Nachrichten abzurufen. Das Konzept ist einfach: Ich überprüfe, ob neue Nachrichten vorliegen, und rufe sie ab.

GuiApplication.java
if (connection.hasNewMessage()) {
    message = connection.retrieveMessage();
}
showMessage(message);

Der erste Teil (connection.hasNewMessage()) überprüft, ob das Programm den Client oder den Server ausführt, und ruft das entsprechende Programm aufretrieveMessage().

Client.java
public String retrieveMessage() throws IOException {
    inbound = socket.getInputStream(); // Defined outside this method
    return IOUtils.toString(inbound, "UTF-8");
}

Zuerst habe ich das mit einem probiertBufferedReader mit einemInputStreamReader und ruft diereadLine() Methode, aber beschlossen, die commons.io-Methode auszuprobieren, als ich bemerkte, dass es nicht funktionierte (das gleiche Problem, mit dem ich gerade konfrontiert bin).

Frage

Mittlerweile ist ziemlich klar: Warum hängt mein Programm, sobald ich auf eine Schaltfläche klicke, die neue Nachrichten abruft?

Externe

Ich bin nicht sicher, ob es verpönt ist, aberhier ist das Github-Repository für den Fall, dass Sie einen besseren Überblick wünschen, obwohl ich glaube, dass die notwendigen Code-Snipper vorhanden sind.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage