Не могу понять, почему не проходит проверку. Вроде все сделано, как надо.

package com.javarush.test.level30.lesson15.big01.client;

import com.javarush.test.level30.lesson15.big01.Connection; import com.javarush.test.level30.lesson15.big01.ConsoleHelper; import com.javarush.test.level30.lesson15.big01.Message; import com.javarush.test.level30.lesson15.big01.MessageType;

import java.io.IOException; //import java.net.Socket;

/* * Created by anvar_000 on 30.10.2016. / public class Client {

protected Connection connection;
private volatile boolean clientConnected = false;

public static void main(String[] args) {
    Client client = new Client();
    client.run();
}

public void run() {
    SocketThread socketThread = getSocketThread();
    socketThread.setDaemon(true);
    socketThread.start();

    try {
        synchronized (this) {
            this.wait();
        }
    } catch (InterruptedException e) {
        ConsoleHelper.writeMessage("Ошибка");
        return;
    }

    if (clientConnected) {
        ConsoleHelper.writeMessage("Соединение установлено. Для выхода наберите команду 'exit'.");

        while (clientConnected) {
            String message;
            if (!(message = ConsoleHelper.readString()).equals("exit")) {
                if (shouldSentTextFromConsole()) {
                    sendTextMessage(message);
                }
            } else {
                return;
            }
        }
    }
    else {
        ConsoleHelper.writeMessage("Произошла ошибка во время работы клиента.");
    }
}

protected String getServerAddress() {
    ConsoleHelper.writeMessage("Введите адрес сервера: ");
    return ConsoleHelper.readString();
}

protected int getServerPort() {
    ConsoleHelper.writeMessage("Введите порт сервера: ");
    return ConsoleHelper.readInt();
}

protected String getUserName() {
    ConsoleHelper.writeMessage("Введите имя пользователя: ");
    return ConsoleHelper.readString();
}

protected boolean shouldSentTextFromConsole() {
    return true;
}

protected SocketThread getSocketThread() {
    return new SocketThread();
}

protected void sendTextMessage(String text) {
    try {
        connection.send(new Message(MessageType.TEXT, text));
    } catch (IOException e) {
        ConsoleHelper.writeMessage("Ошибка отправки");
        clientConnected = false;
    }
}

public class SocketThread extends Thread {
    protected void processIncomingMessage(String message)
    {
        ConsoleHelper.writeMessage(message);
    }

    protected void informAboutAddingNewUser(String userName)
    {
        ConsoleHelper.writeMessage("Участник " + userName + " присоединился к чату :)");
    }

    protected void informAboutDeletingNewUser(String userName)
    {
        ConsoleHelper.writeMessage("Участник " + userName + " покинул чат :(");
    }

    protected void notifyConnectionStatusChanged(boolean clientConnected)
    {
        Client.this.clientConnected = clientConnected;

        synchronized (Client.this) {
            Client.this.notify();
        }
    }

    protected void clientHandshake() throws IOException, ClassNotFoundException
    {
        while (true) {
            Message message = connection.receive();

            switch (message.getType())
            {
                case NAME_REQUEST: {
                    String name = getUserName();
                    connection.send(new Message(MessageType.USER_NAME, name));
                    break;
                }
                case NAME_ACCEPTED:
                    notifyConnectionStatusChanged(true);
                    break;
                default:
                    throw new IOException("Unexpected MessageType");
            }
        }
    }

    protected void clientMainLoop() throws IOException, ClassNotFoundException
    {
        while (true) {
            Message message = connection.receive();

            switch (message.getType())
            {
                case TEXT:
                    processIncomingMessage(message.getData());
                    break;
                case USER_ADDED:
                    informAboutAddingNewUser(message.getData());
                    break;
                case USER_REMOVED:
                    informAboutDeletingNewUser(message.getData());
                    break;
                default:
                    throw new IOException("Unexpected MessageType");
            }
        }
    }

}

}

задан 15 Ноя '16, 12:18

Anvar%20Subhangulov's gravatar image

Anvar Subhan...
11
одобрено: 0%

закрыто 13 Сен, 17:12

AndyRad's gravatar image

AndyRad
13.1k29

Вопрос был закрыт по следующей причине: "Problem is not reproducible or outdated" AndyRad 13 Сен, 17:12


Надо указывать текст задания. А так про реализацию метода clientHandshake() в задании сказано "16.1.3.Если тип полученного сообщения NAME_ACCEPTED (сервер принял имя), значит сервер принял имя клиента, нужно об этом сообщить главному потоку, он этого очень ждет. Сделай это с помощью метода notifyConnectionStatusChanged(), передав в него true. После этого выйди из метода!!!!." последнее выделил. У вас в блоке "case NAME_ACCEPTED:" break означает "закончить текущую итерацию цикла и перейти к следующей итерации". В 113 строке break замените на return.

ссылка

опубликован 16 Ноя '16, 09:10

Azaze11o's gravatar image

Azaze11o
2516
одобрено: 29%

изменено 16 Ноя '16, 09:11

и в default добавьте break в двух методах

(16 Ноя '16, 10:22) Azaze11o

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×3,808
×1,630

Задан: 15 Ноя '16, 12:18

Просмотров: 305 раз

Отредактирован: 13 Сен, 17:12