Как создать экземпляр уровня представления и настроить его между сетью и уровнем приложений в Java? - PullRequest
0 голосов
/ 05 марта 2020

Моя цель - успешно подключиться к клиенту чата и отправлять и получать сообщения на сервер.

Первоначальной реализацией приложения был прямой интерфейс между его сетевым уровнем и прикладным уровнем. Мое задание состоит в том, чтобы добавить слой представления, который использует Caesar Encryption в качестве дополнительного уровня безопасности. Это делается с помощью Eclipse IDE.

Абстрактные методы, которые являются частью диаграммы UML для интерфейса сетевого уровня: (Интерфейс сетевого уровня реализован в классе TCPNetworkLayer.)

openConnection()
closeConnection()
sendMessage(String)
receiveMessage(String)
getPresentationLayer()
setPresentationLayer()

Абстрактные методы, которые являются частью диаграммы UML для интерфейса прикладного уровня: (Интерфейс прикладного уровня реализован в классе прикладного уровня.)

start()
stop()
sendMessage(String)
receiveMessage(String)
getPresentationLayer()
setPresentationLayer()

Абстрактные методы, являющиеся частью Диаграмма UML для уровня представления: (Интерфейс уровня представления реализован в классе шифрования Цезаря.)

start()
stop()
sendMessage(String)
receiveMessage(String)
getNetworkLayer()
setNetworkLayer()
getApplicationLayer()
setApplicationLayer()

Класс ChatClient или файл ChatClient. java содержит метод main.

Как создать экземпляр уровня представления (или это невозможно, так как это интерфейс?) Или класс CaesarEncryption? Один из этих двух будет выступать в качестве посредника между сетевым и прикладным уровнями.

Вот начальный код с // TODO: Инструкции

public class ChatClient {

private static final String SERVER_HOST = "host_information";//e.g. myschool.com
private static final int SERVER_PORT = "port number"; //e.g.3000
private static final String LOGOUT_MESSAGE = ".logout";

private AtomicBoolean running = new AtomicBoolean(false);
private static Thread waitForUserInputThread;

//TODO: Make sure to set this value every time a new message is received. 
private String lastMessgeReceived = null;

private ApplicationLayerInterface applicationLayer;

public static void main(String[] args) throws IOException {
    ChatClient chatClient = new ChatClient(SERVER_HOST, SERVER_PORT);
    chatClient.start();
}

public ChatClient() {
}

public ChatClient(String serverHost, int serverPort) throws IOException {
    //TODO: Part 2: Instantiate the presentation layer and configure the connectivity to other layers
    //TODO: Part 2: Add and use a CaesarEncryption implementation for the presentation layer.
    this.applicationLayer = new ApplicationLayer(this);

    NetworkLayerInterface networkLayer = new TCPNetworkLayer(serverHost, serverPort);

    this.applicationLayer.setNetworkLayer(networkLayer);
    networkLayer.setApplicationLayer(applicationLayer);
}
public void start() {
    applicationLayer.start();
    waitForUserInputThread = new Thread(new Runnable() {
        @Override
        public void run() {
            running.set(true);
            waitForUserInput();
        }
    });
    waitForUserInputThread.start();
    System.out.println("ChatClient started.");
}

Код, который я понимаю в основном, однако Как мне теперь реализовать уровень представления между ними?

Я попробовал следующее:

public class ChatClient {

private static final String SERVER_HOST = "host_information";//e.g. myschool.com
private static final int SERVER_PORT = "port number"; //e.g.3000
private static final String LOGOUT_MESSAGE = ".logout";

private AtomicBoolean running = new AtomicBoolean(false);
private static Thread waitForUserInputThread;

//TODO: Make sure to set this value every time a new message is received. 
private String lastMessgeReceived = null;

private ApplicationLayerInterface applicationLayer;

public static void main(String[] args) throws IOException {
    ChatClient chatClient = new ChatClient(SERVER_HOST, SERVER_PORT);
    chatClient.start();
}

public ChatClient(String serverHost, int serverPort) throws IOException {
    //TODO: Part 2: Instantiate the presentation layer and configure the connectivity to other layers
    //TODO: Part 2: Add and use a CaesarEncryption implementation for the presentation layer.

    this.applicationLayer = new ApplicationLayer(this);

    NetworkLayerInterface networkLayer = new TCPNetworkLayer(serverHost, serverPort);

    /*My Code*/
    //How to instantiate the presentation layer??

    //1.private PresentationLayerInterface presentationLayer; //Error
    //2.PresentationLayerInterface presentationLayer = new PresenationLayerInterface();//Error
   3.PresentationLayerInterface presentationLayer = new CaesarEncryption(10); //No Error

    //How to configure connectivity so Presentation Layer between Network and Application
    this.applicationLayer.setPresentationLayer(presentationLayer);//No Error
    networkLayer.setPresentationLayer(presentationLayer);//No Error

}

Когда я запускаю код выше, я получаю исключение нулевого указателя при отладке chatClient. метод start () По сути, в классе CaesarEncryption метод getNetworkLayer () возвращает нулевые значения для прикладного, презентационного и сетевого уровней. Выглядит ли мое создание представленного выше слоя представления точным? Я точно настроил его между прикладным и сетевым уровнями? Вероятно, есть и другие ошибки, однако эти вопросы являются для меня наиболее важными для начала работы ChatClient (я думаю).

/*Where Chat Client applies start() method in Application Layer via Presentation Layer.*/
/*File name: ApplicationLayer.java */
    @Override
public void start() {
    //TODO: Part 2: Replace with method invocation of the the presentation layer
    //networkLayer.openConnection(); Originally this
   presentationLayer.getNetworkLayer().openConnection();
}

/*It is directed to here in the Caesar Encryption class and all values become null */
/*File name: CaesarEncryption.java */
@Override
public NetworkLayerInterface getNetworkLayer() {
    return networkLayer;
}
...