Приложение зависает при попытке получить текст из входного потока
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 на случай, если вам нужен лучший обзор, хотя я считаю, что необходимые фрагменты кода есть.