Чат (8)

  • 14
  • Недоступна
Класс Handler должен реализовывать протокол общения с клиентом. Выделим из протокола отдельные этапы и реализуем их с помощью отдельных методов: Этап первый – это этап рукопожатия (знакомства сервера с клиентом). Реализуем его с помощью приватного метода String serverHandshake(Connection connection)
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (90)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Artur28 уровень
воскресенье, 11:40
Сделал с помощью рекурсии, хотя в комментах уже видел, что рекурсия не всегда уместна. Если кому интересен алгоритм: 1. Отправить клиенту запрос имени(в метод send connection'a передать новый объект класса message с типом MessageType.NAME_REQUEST) 2. С помощью метода recieve соединения получаем сообщение от пользователя(объект класса Message). 3. Далее наш рекурсивный случай: если тип в пришедшем сообщении не USER_NAME или наше имя пустое: getData().isEmpty()(с проверкой на null не проходит, так и не понял почему) или наша мапа соединений содержит уже такой ключ, то return и новый вызов serverHandshake(connection). 4. После блока if кладём в мапу наше имя и соединение 5. Отправляем клиенту сообщение что name_accpted(по аналогии с 1 пунктом) 6. Возвращаем имя клиента.
Джонни35 уровень
9 января, 02:52
Делаю задачу, разбираюсь, просидел часа 2 пока понял что куда передаётся и что откуда берётся, перепроверил, облагородил, подчистил, всё, думаю, 100% с 1-й попытки сдать должен. Это самое чувство, когда ты уверен, что всё сделал правильно и с замиранием сердца ждёшь результат. Барабанная дробь.... ТА-ДАААА! Ничего не понимаю... КАК ТАК!? По ВСЕМ пунктам!??? И тут понимаю, что создал метод я в классе Server.... Вздохнул, успокоился, передвинул в класс Handler Та-дааа! То же самое! "ДА ЧТО ТАКОЕ!?", подумал я. И тут до меня доходит, что я вставил код снова в класс Server, но только ниже класса Handler. Посмотрел на часы.....и написал комментарий :) Всё-таки, сдал, когда в класс попал xD Высыпайтесь, Дамы и Господа!
Vitaly Khan35 уровень
5 января, 04:06
использовал цикл do ... while. на мой взгляд, он сюда просто просится. но валидатор его категорически не принимает. вопрос к опытным. а вообще, использовать эту конструкцию цикла - не дурной тон? почему-то в кодах опытных программистов не встречаю пока, да и тут на Джавараш вроде о нем не рассказывали. действительно в нашем случае лучше использовать while (true), как настаивает валидатор?
Эльвира30 уровень, Санкт-Петербург
28 декабря 2018, 10:16
Порядок важен: if(mes.getType() == MessageType.USER_NAME && !str.isEmpty() && !connectionMap.containsKey(str)) Не проходило по этой причине!
Николай Малинчик36 уровень, Санкт-Петербург
7 февраля, 15:14
вот это спасибо!
25 декабря 2018, 14:12
10 попыток. Валли меня замучал.
Владик Жучков32 уровень, Харьков
9 декабря 2018, 11:43
Эта часть сложная, изменили бы условие или добавили бы подсказки, немного непонятно... пришлось смотреть коды у других...
Алексей31 уровень, Москва
20 ноября 2018, 13:08
Вот эта часть очень понравилась. Прям удовольствие после решения получил)))
Алексей31 уровень, Москва
20 ноября 2018, 13:08
Вот эта часть очень понравилась. Прям удовольствие после решения получил)))
Алексей28 уровень, Киев
31 октября 2018, 22:39
Был уверен, что "проверить, что оно не пустое" это сравнить с null. Теперь буду знать про isEmpty().
SpacePurr28 уровень, Казань
4 декабря 2018, 16:38
Теперь и я буду знать. Вместо isEmpty() прокатило с equals("");
Olexandr Leonets31 уровень, Киев
28 сентября 2018, 22:41
Попался на следующее: после успешного проведения всех проверок, метод serverHandshake должен .... и отправлять сообщение о том, что имя было принято. надо было connection.send(new Message(MessageType.NAME_ACCEPTED)); а я написал ConsoleHelper.writeMessage("SuperGood.");