Чат (11)

  • 14
  • Недоступна
Пришло время написать главный метод класса Handler, который будет вызывать все вспомогательные методы, написанные ранее. Реализуем метод void run() в классе Handler. Он должен: 1) Выводить сообщение, что установлено новое соединение с удаленным адресом, который можно получить с помощью метода getRe
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (93)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Николай Малинчик34 уровень, Санкт-Петербург
7 февраля, 15:55
getRemoteSocketAddress запилил в try/catch и не проходило, пока до него не вынес(
Джонни35 уровень
11 января, 08:13
Не логично использовать
socket.getRemoteSocketAddress()
Для этого мы писали метод
public SocketAddress getRemoteSocketAddress() {
	return socket.getRemoteSocketAddress();
}
класса Connection.
IGIngvar28 уровень
22 января, 08:53
со 2 попытки решил, и использовал как раз наш метод, а почему-то надо было просто socket использовать
Vitaly Khan35 уровень
5 января, 08:05
у кого тоже возникли проблемы с getRemoteSocketAddress, читайте внизу сообщения Влада Шерышева и Domadin. без их подсказки еще бы долго недоумевал, почему не проходит первый пункт.
SpacePurr28 уровень, Казань
15 декабря 2018, 08:51
Лучший способ изучить лямбды - это пихать их везде
connectionMap.entrySet().removeIf(name -> name.getKey().equals(userName));
Алексей31 уровень, Москва
21 ноября 2018, 10:23
Внезапно с первой попытки. Аж сам охирел)))
Serj41 уровень, Киев
7 ноября 2018, 00:20
10 попыток.... не проходило по таймауту. Почему-то висло на цикле в serverHandshake do{...}while (response == null || response.getType() != MessageType.USER_NAME || .....) убрал проверку на нулл - сразу же приняло, хотя на прошлых заданиях все прошло без проблем
Maria8 уровень, Москва
3 октября 2018, 21:07
Да ладно!!!.... connectionMap.remove(userName); - должно быть внутри блока try, после serverMainLoop(connection, userName); Иначе если положить в блок catch или ниже не проходит проверку по последнему пункту: "Метод run должен корректно обрабатывать исключения IOException и ClassNotFoundException." Где мля логика? serverMainLoop не может завершиться никак, кроме как по Exception. Т.е. нет никаких шансов для исполнения connectionMap.remove(userName) и все мусорные userName будут валяться в connectionMap до завершения всего процесса! Я не понимаю, зачем я пишу такое забагованное приложение, чему я научусь?
Сергей36 уровень, Нижний Новгород
5 января, 00:17
connectionMap.remove(userName) должен находится уже после блока catch, когда все исключения обработаны и connect закрыт, тогда логика очень даже прозрачна. А проверку, прошло ли рукопожатие можно организовать вот так:
if(userName != null){
    connectionMap.remove(userName);
    sendBroadcastMessage(new Message(MessageType.USER_REMOVED, userName));
}
при условии что String userName = null; объявлен именно так и до блока try.
Alena35 уровень, Минск
8 сентября 2018, 08:37
Вот я деревня! Про try-with-resources я вспомнила, а то, что с ним не дойдёт до finally - "забыла"! И, главное, пыталась потом переписать без try-with-resources - Валидатор не принимал... Забила...
Creilyss40 уровень
10 сентября 2018, 12:13
как это не дойдет до finally ?!
try ( Connection connection = new Connection(socket) ) {
...
} catch (IOException | ClassNotFoundException e) {
...
} finally {
...
}
вполне себе доходит и это и есть правильная конструкция.
Alena35 уровень, Минск
11 сентября 2018, 12:28
Очень может быть... только валидатор не принял с финальными действиями в finally...
Артем38 уровень, Москва
12 сентября 2018, 09:54
а зачем здесь finally? все отлично помещается в блоке try
Артем28 уровень, Минск
3 сентября 2018, 13:38
Используйте Try-with-resources. Не зря же мы реализовали интерфейс Closeable в классе Connection!
try(Connection connection= new Connection(socket)) {

...решение задачи...

} }catch (IOException e){ConsoleHelper.writeMessage("Error");}
    catch (ClassNotFoundException x){ConsoleHelper.writeMessage("Error");}
Огромный плюс использования try с ресурсами в том, что если попытаться закрыть close вручную в блоке catch, то там возникнет еще одно исключение, а try-wit-resources эти исключения в блоке catch автоматом обрабатывает
DeH4uK34 уровень, Харьков
21 января, 13:41
Только вот одно замечание. Если вы работаете в Intellij IDEA, она вероятно вам подсказывает что одинаковые тела у ветвей catch. Так вот, можно написать общее исключение для этого случая - Exception. Ведь IOException и ClassNotFoundException (который является потомком класса ReflectiveOperationException) это потомки более общего класса Exception (который в свою очередь так же является потомком класса родителя-исключений, назовём его так, - Throwable). 2 исключения не возникнут в любом случае (если возникнет исключение IOException то исключению ClassNotFoundException уже не быть, и наоборот). В данном случае лаконичнее и правильнее будет: try (Connection connection = new Connection(socket)) { ... solution } catch (Exception ex) { ConsoleHelper.writeMessage("Error?!"); } Успехов в обучении!)
GAZ27 уровень
6 августа 2018, 17:20
Пока ВСЕ не засунул в try-catch не смог пройти пунт "Метод run должен корректно обрабатывать исключения IOException и ClassNotFoundException."