Приложение зависает при попытке получить текст из входного потока

SituationI»

Мы создали программу для обмена сообщениями между двумя компьютерами в локальной сети. Один компьютер идентифицирует себя как сервер, а другой - клиент. После запуска пользователь должен ввести хост и порт другого компьютера, если он хочет подключиться как клиент к этому компьютеру. Настройка того, как это работает, очень проста: вы вводите свое сообщение, нажимаете ввод, и оно появляется на вашем собственном экране. После этого ваш собеседник должен нажать на кнопку, чтобы получить последние сообщения, и он должен появиться на его экране. Это продолжается до тех пор, пока кто-то не уйдет.

проблема

Программа запускается правильно и запрашивает настройки соединения. После этого я инициирую соединение на обоих компьютерах, и кажется, что все идет хорошо (после того, как соединение установлено, метка показывает вам, каков ваш статус, например, Клиент или Сервер (1)). Вещи продолжают выглядеть хорошо, когда я ввожу сообщение и отправляю его, вывод записывается отправителю 'с экрана и не происходит неожиданное поведение.

Когда я хочу получить сообщения на другом компьютере, программа полностью зависает. Никакие объекты в графическом интерфейсе не активируются и не отображаются.

Код

Предполагая, что соединение установлено правильно (см. (1)), я опишу процесс отправки сообщения ниже, оставляя при этом ненужные части.

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

Процесс отправки сообщения довольно прост, но я хотел бы включить его на всякий случаймы что-то упустили.

Далее следует код, который яМы создали, чтобы получить новые сообщения. Концепция проста: я проверяю, есть ли новые сообщения, и если они есть, я получаю их.

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

Первая часть (connection.hasNewMessage()) проверит, работает ли программа либо на клиенте, либо на сервере, и вызовет соответствующий.retrieveMessage()

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

Сначала ямы пробовали это сBufferedReader используяInputStreamReader и зоветreadLine() метод, но решил попробовать метод commons.io, как только я заметил, что это не такработать (та же проблема, с которой я сталкиваюсь в настоящее время).

Вопрос

Это'К этому моменту все стало ясно: почему моя программа зависает, когда я нажимаю кнопку, которая получает новые сообщения?

ExternalI»

я не уверен, если этохмурится, новот репозиторий github на случай, если вам нужен лучший обзор, хотя я считаю, что необходимые фрагменты кода есть.

Ответы на вопрос(2)

Ваш ответ на вопрос