Чат (8)

  • 14
  • Недоступна
Класс Handler должен реализовывать протокол общения с клиентом. Выделим из протокола отдельные этапы и реализуем их с помощью отдельных методов: Этап первый – это этап рукопожатия (знакомства сервера с клиентом). Реализуем его с помощью приватного метода String serverHandshake(Connection connection)
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (107)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Николай29 уровень
пятница, 08:43
Не сразу понял требования, но по факту нужно: Послать запрос с типом NAME_REQUEST Получить ответ с типом USER_NAME Отправить ответ с типом NAME_ACCEPTED Все остальное четко по условиям задачи.
Игорь Ким31 уровень, Тольятти
18 июля, 03:20
у меня вместо isEmpty принял с !message.getData().matches("^\\s*")
Lein35 уровень, Москва
15 мая, 07:44
Кошмар, с 13 попытки. Все потому, что не нужно для красоты добавлять connection.send(new Message(MessageType.USER_ADDED));
Андрей41 уровень
8 мая, 10:47
1. Рекурсию можно 2. Имя проверять isEmpty. Пробовал проверить через регулярное выражение - валидатор не пропускает по таймауту.
Сергей41 уровень, Москва
18 июня, 12:02
Спасибо, тоже убил куеву тучу попыток
Tom Riddle31 уровень, Москва
9 августа, 06:49
Проверка имени по ="" тоже проходит.
Даниил34 уровень
1 мая, 09:50
Короче исходя из своих попыток и советов по "преодолению валидатора" главная суть такова... Прошёл вариант только тот где имя пользователя проверялось методом isEmpty(), на равенство/неравенство null не принимал. Кому интересно сделал так: 1. В бесконечном цикле while выполнял запрос методом send(new Message...) 2. Получал сообщение методом receive() 3. Для (как мне показалось) простоты понимания сделал первые 2 проверки во внешнем if/else, а 3-ю проверку во вложенном в него. Если условия не соответсвовали то использовал continue
Antony.Glim35 уровень, Санкт-Петербург
3 апреля, 10:05
Валидатор принял проверки в разных ветках в такой последовательности: имя, тип, наличие в массиве. Не забудьте, что имя не может быть пустым)))) + 5 попыток на пустое имя
Александр Снопков29 уровень, Красноярск
26 марта, 04:14
Не смотрите на 3-й пункт валидатора, пока не выполните все остальные
Вадим35 уровень, Новосибирск
24 марта, 19:31
if (message.getType() == MessageType.USER_NAME &&
!message.getData().isEmpty() &&
!connectionMap.containsKey(userName))
Валик принял только в этой последовательности, в цикле while (true), с созданием объекта Message и обращением к типу и данным через него. Очень плохой Валик!
Boris28 уровень
30 апреля, 13:23
я как понимяю у тебя переменная
String userName = message.getData();
зачем в if( !message.getData().isEmpty()) если можно проше userName.isEmpty() не вызывая заного этот метод и сэкономить пару наносекунд :))
Юрий Рощенко34 уровень, Polska
11 марта, 21:02
do {... } while () зачем тут рекурсия...
Artur41 уровень
17 февраля, 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. Возвращаем имя клиента.
Boris28 уровень
30 апреля, 13:25
как не странно у меня с проверкой на нулл потом на пустоту валик принял без проблем.