Aplikacja zawiesza się podczas próby pobrania tekstu ze strumienia wejściowego

Sytuacja

Tworzyłem program do wymiany wiadomości między dwoma komputerami w sieci LAN. Jeden komputer identyfikuje się jako serwer, a drugi jest klientem. Po uruchomieniu użytkownik musi wejść do hosta i portu innego komputera, jeśli chce połączyć się z nim jako klient. Konfiguracja tego, jak to działa, jest bardzo prosta: wpisujesz wiadomość, naciskasz Enter i pojawia się na twoim ekranie. Następnie partner konwersacji musi kliknąć przycisk, aby pobrać najnowsze wiadomości i powinien pojawić się na jego ekranie. To trwa, dopóki ktoś nie odejdzie.

Problem

Program uruchomi się poprawnie i poprosi o ustawienia połączenia. Następnie inicjuję połączenie na obu komputerach i wszystko wygląda dobrze (po nawiązaniu połączenia etykieta pokazuje, jaki jest twój status, np. Klient lub Serwer, to (1)). Sprawy nadal wyglądają dobrze, gdy wprowadzam wiadomość i wysyłam ją, dane wyjściowe są zapisywane na ekranie nadawcy i nie zachodzi nieoczekiwane zachowanie.

Gdy chcę pobrać wiadomości na innym komputerze, program całkowicie zawiesza się. Żadne obiekty w GUI nie są klikalne i nie są wyświetlane żadne dane wyjściowe.

Kod

Zakładając, że połączenie zostało poprawnie ustanowione (patrz (1)), przedstawię poniżej proces wysyłania wiadomości, pomijając części nieistotne.

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);
}

Proces wysyłania wiadomości jest całkiem prosty, ale chciałem go włączyć na wypadek, gdyby coś przeoczyłem.

Poniżej znajduje się kod, który stworzyłem, aby pobrać nowe wiadomości. Koncepcja jest prosta: sprawdzam, czy są jakieś nowe wiadomości, a jeśli są, to je odzyskuję.

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

Pierwsza część (connection.hasNewMessage()) sprawdzi, czy program albo uruchamia klienta lub serwer i wywołuje odpowiedniretrieveMessage().

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

Na początku próbowałem tego zBufferedReader za pomocąInputStreamReader i dzwoniąc doreadLine() metoda, ale zdecydowałem się wypróbować metodę commons.io, gdy zauważyłem, że nie działa (ten sam problem, z którym mam obecnie do czynienia).

Pytanie

Jest już całkiem jasne: dlaczego mój program zawiesza się w momencie, gdy klikam przycisk, który pobiera nowe wiadomości?

Zewnętrzny

Nie jestem pewien, czy jest to źle widziane, aletu jest repozytorium github na wypadek, gdybyś chciał mieć lepszy przegląd, chociaż uważam, że potrzebne są snajperki kodu.

questionAnswers(2)

yourAnswerToTheQuestion