• ,

Чат (21) Не могу сам додуматься, почему так и как вообще подключиться к какому-то серверу?

Ребят, всем привет. Прохожу большую задачу «Чат», и на 21 подуровне наткнулся на вопрос, который выделен жирным.
5. Переопредели методы в классе ClientGuiController:

а) SocketThread getSocketThread() – должен создавать и возвращать объект типа GuiSocketThread.

б) void run() – должен получать объект SocketThread через метод getSocketThread() и вызывать у него метод run().Разберись, почему нет необходимости вызывать метод run в отдельном потоке, как мы это делали для консольного клиента.
И вот думал-думал, но никак до чего-то стоящего не додумался. Кто уже проходил и знает, почему так? Я конечно уже несколько задач назад сбился с понимания отдельных моментов того, что происходит, но всё же понимаю общую картину и не секу, почему не вызываем отдельный трэд. Хотелось бы разобраться.
Заранее спасибо за ответ.

P.S. Закончил уже задачу, всё прошёл.Но теперь возник вопрос, к какому серверу вообще можно подключиться? Или его можно как-то создать?

level34.lesson15.big01 задание 10

Условие задания

Задание 10.

В игре будет несколько уровней, все уровни будут храниться в текстовом файле. Сейчас мы
напишем тестовую реализацию загрузчика уровней LevelLoader. Почему тестовую? Полный
функционал нам пока не нужен, он довольно сложный, оставим его на потом. А пока:
10.1. Создай класс LevelLoader в пакете model.
10.2. Добавь в класс конструктор, принимающий Path levels. Параметр levels – это
путь к тестовому файлу, содержащему описание уровней.
10.3. Добавь в класс LevelLoader метод GameObjects getLevel(int level). Пока не важно,
что будет возвращать этот метод. Пусть он всегда возвращает набор из: одного игрока,
одного дома, одного ящика и нескольких стен. Так будет проще отладить работу игры.
Координаты каждого объекта должны быть не нулевые и кратны половине
FIELD_SELL_SIZE (центр каждого объекта должен быть в середине ячейки поля).

И не пойму что не так с моей реализацией, уже крутил и так и сяк, менял модификаторы полей и т.д.
Перечитывал условие 10 раз, как по мне, то у меня все правильно реализовано, добавил 3 стены, ящик, игрока и дом, но валидацию не проходит.
В инете лазил, тоже никакие предыдущие топики по этой задачи не натолкнули меня на идею, что же у меня неправильно.
Посмотрите свежим взглядом, может что нибудь заметите:


package com.javarush.test.level34.lesson15.big01.model;

import java.nio.file.Path;
import java.util.HashSet;
import java.util.Set;

import static com.javarush.test.level34.lesson15.big01.model.Model.FIELD_SELL_SIZE;

public class LevelLoader {

    private Path levels;

    public LevelLoader(Path levels) {
        this.levels = levels;
    }

    public GameObjects getLevel(int level) {
//ищем средину ячейки
        int x = FIELD_SELL_SIZE / 2;
        int y = FIELD_SELL_SIZE / 2;

// Объявляем и инициализируем сэты
        Set<Wall> walls = new HashSet<>();
        Set<Box> boxes = new HashSet<>();
        Set<Home> homes = new HashSet<>();
//И объявляем плеера
        Player player;

//Добавляем значения в сэты, тут все кратное, при умножении ну точно уж кратно начальному числу.

        walls.add(new Wall(x, y));
        walls.add(new Wall(x, y * 2));
        walls.add(new Wall(x, y * 3));

        boxes.add(new Box(x * 2, y * 2));
        homes.add(new Home(x * 3, y * 3));
        player = new Player(x * 4, y * 4);

//Ну и возвращаем объект который надо вернуть.
        return new GameObjects(walls, boxes, homes, player);
    }
}

level30.lesson15.big01 Бьюсь третий день...

… Ну как бьюсь: Перечитываю код, говорю себе: «Да блин… правильно же всё», отправляю на проверку, ничего не изменив XD

Вот текст задания:

Приступим к самому важному – написанию сервера Server. Сервер должен поддерживать
множество соединений с разными клиентами одновременно. Это можно реализовать с
помощью следующего алгоритма:
— Сервер создает серверное сокетное соединение
— В цикле ожидает, когда какой-то клиент подключится к сокету
— Создает новый поток обработчик Handler, в котором будет происходить обмен
сообщениями с клиентом.
— Ожидает следующее соединение.
Добавь:
6.1. В класс Server приватный статический вложенный класс Handler, унаследованный от
Thread.
6.2. В класс Handler поле типа Socket.
6.3. В класс Handler конструктор, принимающий в качестве параметра Socket и
инициализирующий им соответствующее поле класса.
6.4. В класс Server добавь метод main, он должен:
6.4.1. Запрашивать порт сервера, используя ConsoleHelper
6.4.2. Создавать серверный сокет java.net.ServerSocket, используя порт из п.6.4.1
6.4.3. Выводить сообщение, что сервер запущен
6.4.4. В бесконечном цикле слушать и принимать входящие сокетные соединения
серверного сокета из п.6.4.2
6.4.5. Создавать и запускать новый поток Handler, передавая в конструктор сокет из
п.6.4.4
6.4.6. После создания потока обработчика Handler переходить на новый шаг цикла
6.4.7. Предусмотреть закрытие серверного сокета в случае возникновения исключения.
Если исключение Exception все же произошло, поймать его и вывести сообщение
об ошибке.

А это, собстно, сам код:

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

public class Server
{
    private static class Handler extends Thread{
        Socket socket;

        Handler (Socket socket) {
            this.socket = socket;
        }
    }

    public static void main(String[] args)
    {
        ConsoleHelper.writeMessage("Порт?");
        ServerSocket serverSocket = null;
        try{
            serverSocket = new ServerSocket(ConsoleHelper.readInt());
            ConsoleHelper.writeMessage("Сервер запущен");
        } catch (IOException e) {}

        try {
            while (true) {
                Socket socket = serverSocket.accept();
                if (socket != null) {
                    Handler handler = new Handler(socket);
                    handler.run();
                }
            }
        }catch (Exception e){
            ConsoleHelper.writeMessage("Возникла ошибка!");
        }finally {
            try {
                serverSocket.close();
            } catch (IOException e) {}
        }
    }
}


Буду признателен за любую помощь и комментарии!

Уровень 26, урок 15, большая задача 1. Задание 8.

Уже никакого терпения не хватает, будьте добры, укажите почему может не приниматься:
Задание 8
Пора привести в порядок наш main, уж очень там всего много, чего не должно быть.

1. Перенесите логику из main в DepositCommand и InfoCommand
Проверим, что там стало с main? Цикл, в котором спрашиваем операцию у пользователя,
 а потом вызываем метод у CommandExecutor.
И так до бесконечности... надо бы придумать условие выхода из цикла.
Исправь цикл, чтоб он стал do-while. Условие выхода - операция EXIT.

2. Давайте запустим прогу и пополним
 счет на EUR 100 2 и USD 20 6, и посмотрим на INFO.
Ничего не понятно, т.к. создались 2 манипулятора: первый для EUR, второй для USD.
Давайте улучши3м логику InfoCommand. Надо вывести баланс по каждому манипулятору.

2.1. В классе CurrencyManipulatorFactory создайте статический метод
 getAllCurrencyManipulators(), который вернет Collection всех манипуляторов.
У вас все манипуляторы хранятся в карте, не так ли? Если нет, то рефакторьте.
2.2. В InfoCommand в цикле выведите
[код валюты - общая сумма денег для выбранной валюты]
Запустим прогу и пополним счет на EUR 100 2 и USD 20 6, и посмотрим на INFO.
Все работает правильно?
 EUR - 200
 USD - 120
Отлично!

3. Запустим прогу и сразу первой операцией попросим INFO.
Ничего не вывело? Непорядок.
Добавьте в манипулятор метод boolean hasMoney(), который
будет показывать, добавлены ли какие-то банкноты или нет.

4. В InfoCommand используйте метод п.3. и выведите фразу
 "No money available.", если нет денег в банкомате.

package com.javarush.test.level26.lesson15.big01;

import java.util.HashMap;
import java.util.Map;

public class CurrencyManipulator {
    private String currencyCode;
    private static Map<Integer, Integer> denominations = new HashMap<>();

    public CurrencyManipulator(String currencyCode) {
        this.currencyCode = currencyCode;
    }

    public String getCurrencyCode() {
        return currencyCode;
    }

    public void addAmount(int denomination, int count){
        if(denominations.containsKey(denomination))
            denominations.put(denomination, denominations.get(denomination) + count);
        else
            denominations.put(denomination,count);
    }

    public boolean hasMoney(){
        if (denominations.isEmpty()) return false;
        else {
            for (Map.Entry<Integer,Integer> pair : denominations.entrySet()){
                if (pair.getValue()!=0) return true;
            }
            return false;
        }
    }

    public int getTotalAmount(){
        int result = 0;
        for(Map.Entry<Integer,Integer> pair : denominations.entrySet())
            result = result + (pair.getKey() * pair.getValue());

        return result;
    }
}

package com.javarush.test.level26.lesson15.big01.command;

import com.javarush.test.level26.lesson15.big01.ConsoleHelper;
import com.javarush.test.level26.lesson15.big01.CurrencyManipulator;
import com.javarush.test.level26.lesson15.big01.CurrencyManipulatorFactory;

import java.util.Collection;

class InfoCommand implements Command{
    @Override

    public void execute() {
        boolean money = false;
        ConsoleHelper.writeMessage("Information: ");
        for (CurrencyManipulator cur : CurrencyManipulatorFactory.getAllCurrencyManipulators()){
            if (cur.hasMoney()){
                if (cur.getTotalAmount() > 0)
                {
                    ConsoleHelper.writeMessage(cur.getCurrencyCode() + " - " + cur.getTotalAmount());
                    money = true;
                }
            }
        }
        if (!money)
            ConsoleHelper.writeMessage("No money available.");
    }
}

package com.javarush.test.level26.lesson15.big01.command;

import com.javarush.test.level26.lesson15.big01.ConsoleHelper;
import com.javarush.test.level26.lesson15.big01.CurrencyManipulator;
import com.javarush.test.level26.lesson15.big01.CurrencyManipulatorFactory;

class DepositCommand implements Command{
    @Override
    public void execute() {
        ConsoleHelper.writeMessage("Depositing...");

        String curCod = ConsoleHelper.askCurrencyCode();
        CurrencyManipulator manipulator = CurrencyManipulatorFactory.getManipulatorByCurrencyCode(curCod);

        String[] row = ConsoleHelper.getValidTwoDigits(curCod);

        try {
            int numb1 = Integer.parseInt(row[0]);
            int numb2 = Integer.parseInt(row[1]);

            manipulator.addAmount(numb1, numb2);
            ConsoleHelper.writeMessage(String.format("%d %s was deposited successfully", numb1 * numb2, curCod));
        }
        catch(NumberFormatException e){
            ConsoleHelper.writeMessage("Please enter the valid data.");
        }

    }
}

package com.javarush.test.level26.lesson15.big01;

import com.javarush.test.level26.lesson15.big01.command.CommandExecutor;
import com.javarush.test.level26.lesson15.big01.exception.InterruptOperationException;

import java.util.Locale;

/**
 * Created by Stanislav on 19.08.2016.
 */
public class CashMachine {
    public static void main(String[] args) {
        Locale.setDefault(Locale.ENGLISH);

        Operation s = null;

        do {
            try {
                s = ConsoleHelper.askOperation();
                CommandExecutor.execute(s);
            } catch (InterruptOperationException e) {
                e.printStackTrace();
            }
        } while (s != Operation.EXIT);
    }
}


package com.javarush.test.level26.lesson15.big01;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Stanislav on 19.08.2016.
 */
public class CurrencyManipulatorFactory {
    private static Map<String, CurrencyManipulator> manipulators = new HashMap<>();

    public static CurrencyManipulator getManipulatorByCurrencyCode(String currencyCode){
        CurrencyManipulator man = manipulators.get(currencyCode);

        if (man == null) {
            man = new CurrencyManipulator(currencyCode);
            manipulators.put(currencyCode, man);
        }

        return man;
    }

    private CurrencyManipulatorFactory(){}

    public static Collection<CurrencyManipulator> getAllCurrencyManipulators(){
        return manipulators.values();
    }
}


  • ,

level26.lesson15.big04 - тесты все перебрал, какие в голову пришли

Добрых вам суток!

Собственно задание:
Задание 4
1. Выберем операцию, с которой мы сможем начать.
Подумаем. В банкомате еще денег нет, поэтому INFO и WITHDRAW протестить не получится.
Начнем с операции DEPOSIT — поместить деньги.
Считаем с консоли код валюты, потом считаем номинал и количество банкнот, а потом добавим их в манипулятор.

2. Чтобы считать код валюты, добавим статический метод String askCurrencyCode() в ConsoleHelper.
Этот метод должен предлагать пользователю ввести код валюты, проверять, что код содержит 3 символа.
Если данные некорректны, то сообщить об этом пользователю и повторить.
Если данные валидны, то перевести код в верхний регистр и вернуть.

3. Чтобы считать номинал и количество банкнот, добавим статический метод
String[] getValidTwoDigits(String currencyCode) в ConsoleHelper.
Этот метод должен предлагать пользователю ввести два целых положительных числа.
Первое число — номинал, второе — количество банкнот.
Никаких валидаторов на номинал нет. Т.е. 1200 — это нормальный номинал.
Если данные некорректны, то сообщить об этом пользователю и повторить.
Пример вводимых данных:
200 5

4. В классе CurrencyManipulator создайте метод void addAmount(int denomination, int count),
который добавит введенные номинал и количество банкнот

5. Пора уже увидеть приложение в действии.
В методе main захардкодь логику пункта 1.
Кстати, чтобы не было проблем с тестами на стороне сервера, добавь в метод main первой строчкой Locale.setDefault(Locale.ENGLISH);
Запускаем, дебажим, смотрим.

Сначала пробовал без вывода приглашений, потом с выводом. Добавлял и убирал различные прибамбасы вроде тримминга данных и проверки валюты разными способами. В таких больших заданиях очень не хватает существенного пояснения о том, какой же именно тест валится в валидаторе.

CashMachine:

package com.javarush.test.level26.lesson15.big01;

import java.util.Locale;

/**
 * Created by Home-pc on 25.02.2016.
 */
public class CashMachine
{
    public static void main(String[] args)
    {
        Locale.setDefault(Locale.ENGLISH);
        String cc = ConsoleHelper.getCurrencyCode();
        CurrencyManipulator cm = CurrencyManipulatorFactory.getManipulatorByCurrencyCode(cc);
        String[] nc = ConsoleHelper.getValidTwoDigits(cc);
        cm.addAmount(Integer.parseInt(nc[0]), Integer.parseInt(nc[1]));
    }
}


CurrencyManipulator:

package com.javarush.test.level26.lesson15.big01;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Home-pc on 25.02.2016.
 */
public class CurrencyManipulator
{
    private String currencyCode;
    private Map<Integer, Integer> denominations;

    public CurrencyManipulator(String currencyCode)
    {
        this.currencyCode = currencyCode;
        denominations = new HashMap<>();
    }

    public String getCurrencyCode()
    {
        return currencyCode;
    }

    public void addAmount(int denomination, int count) {
        Integer cnt = denominations.get(denomination);
        if (cnt == null) {
            cnt = 0;
        }
        denominations.put(denomination, cnt + count);
    }
}


ConsoleHelper:

package com.javarush.test.level26.lesson15.big01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Created by Home-pc on 25.02.2016.
 */
public class ConsoleHelper
{
    private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void writeMessage(String message) {
        System.out.println(message);
    }

    public static String readString() {
        try {
            String s = reader.readLine();
            //s = s.trim();
            return s;
        } catch (IOException e) {}

        return null;
    }

    public static String getCurrencyCode() {
        String s;
        boolean error = false;
        do {
            if (error)
                writeMessage("Invalid currency code, please try again.");
            writeMessage("Input currency code:");
            s = readString();
            error = true;
        } while (s == null ||
                //s.length() != 3); // Тоже пробовал, не помогает
                !s.matches("[A-Za-z]{3}"));

        return s.toUpperCase();
    }

    public static String[] getValidTwoDigits(String currencyCode) {
        String s;
        String[] parts;
        int a, b;
        boolean error = false;
        do {
            a = 0;
            b = 0;
            if (error)
                writeMessage("Invalid denomination and/or count, please try again.");
            writeMessage("Input denomination and count for '"+currencyCode+"' currency:");
            s = readString();
            parts = s.split("\\s+");
            if (parts.length != 2)
            {
                error = true;
                continue;
            }
            try {
                a = Integer.parseInt(parts[0]);
                b = Integer.parseInt(parts[1]);
            } catch (NumberFormatException e) {}
            error = true;
        } while (a <= 0 || b <= 0);

        return parts;
    }
}


CurrencyManipulatorFactory:

package com.javarush.test.level26.lesson15.big01;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Home-pc on 25.02.2016.
 */
public class CurrencyManipulatorFactory
{
    private static Map<String, CurrencyManipulator> manipulators = new HashMap<>();

    private CurrencyManipulatorFactory() {}

    public static CurrencyManipulator getManipulatorByCurrencyCode(String currencyCode) {
        CurrencyManipulator cm = manipulators.get(currencyCode);
        if (cm == null) {
            cm = new CurrencyManipulator(currencyCode);
            manipulators.put(currencyCode, cm);
        }
        return cm;
    }
}


Подскажите, люди добрые, что может быть не так.

Благодарю за внимание.
  • ,

Техническая проблема с большой задачей

Случайно потёр с компа классы большой задачи (level22.lesson18.big01) в середине решения (Задача 14). Задачу решил, но прога не компилируется, так как ссылается на классы/поля/методы в соседних классах, которые удалены. Сервер соответственно тоже не принимает. При использовании плагина подгружается только один класс. Тот, которого касается данная конкретная задача 14. Возможно подгрузить эти классы как-либо иначе?
  • ,

level24.lesson14.big01

Задание 10
Что мы будем делать с Canvas?
Мы будем рисовать на нем (в его матрице).
Поэтому нам понадобятся два метода
public void setPoint(double x, double y, char c)
public void drawMatrix(double x, double y, int[][] matrix, char c)