Проблема с сервером / клиентом Java

1

Итак, вот вопрос, который нам дал:

Для простого клиент-серверного приложения предоставляется следующий сетевой протокол уровня приложения.

Клиент может отправлять токены (слова) на сервер, который добавляет их в глобальный список токенов в памяти. Список токенов имеет 10 разных токенов. Значки должны быть сохранены в списке токенов в нисходящем (обратном) лексикографическом порядке. Существует три типа запросов: SUBMIT, REMOVE и QUIT.

Протокол подробно:

  • Запрос клиента (сообщение от клиента к серверу): токен SUBMIT Сервер: если список токенов еще не заполнен, добавьте токен в глобальный список токенов (если список еще не содержит этот токен) или проигнорируйте его (если соответствующий токен уже был в списке). В обоих случаях ответьте, отправив клиенту сообщение OK. Если список уже заполнен (содержит 10 токенов), ответьте клиенту с сообщением ERROR. token обозначает строку, которая не содержит пробелов, см. класс Scanner (Java API). Список токенов следует сортировать в нисходящем лексикографическом порядке в любое время. Выберите подходящую структуру данных для представления списка токенов.
  • Запрос клиента: REMOVE token Server: если список токенов содержит токен, удалите его из списка токенов и ответьте клиенту с сообщением OK. В противном случае ответьте с помощью ERROR.
  • Запрос клиента: QUIT Server: завершает соединение с этим клиентом. Нет ответа.

Q1. Создайте (не-корпоративный, несервлет-) Java-класс для сервера, который может взаимодействовать с клиентами через Интернет в соответствии с данным протоколом. Не поддерживайте одновременную обработку клиентов здесь, просто последовательное обращение с клиентами (то есть только после того, как соединение с клиентом завершено, новый клиент может подключиться к серверу и т.д.). Сервер должен поддерживать только один глобальный список токенов, который никогда не очищается сервером, если только с помощью запросов REMOVE (т.е. Не новый пустой список токенов для каждого подключаемого клиента).

И вот моя попытка:

public class Server {

private Socket s;
private Scanner in;
private PrintWriter out;

public static void main(String[] args) throws IOException {
    ServerSocket server = new ServerSocket(6789);
    Server serverInstance = new Server();
    System.out.println("Server running. Waiting for a client to connect...");
    while(true) {
        serverInstance.s = server.accept();
        System.out.println("Client connected");
        serverInstance.run();
        System.out.println("Client disconnected. Waiting for a new client to connect...");
    }
}

public void run() {
    try {
        try {
            in = new Scanner(s.getInputStream());
            out = new PrintWriter(s.getOutputStream());
            doService(); // the actual service
        } finally {
            s.close();
        }
    } catch (IOException e) {
        System.err.println(e);
    }
}
public void doService() throws IOException {
    while(true) {
        if(!in.hasNext())
            return;
        String request = in.next();
        System.out.println("Request received: " + request);
        // (...) test for type of request here (not implemented)
        Request(request);
    }
}
public void Request(String request) {
    ArrayList<String> tokens = new ArrayList<String>(10);
    String amountStr = in.next();
    if(request.startsWith("SUBMIT")) {
        if(tokens.size() <= 10){
            out.println(tokens.add(amountStr)); //server response
            System.out.println( amountStr + " added to list");
        }
        else{System.out.println("Error");
        } 
    }
    else if(request.startsWith("REMOVE")) {
    out.println(tokens.remove(amountStr)); //server response
    System.out.println(amountStr + " removed from list");
    } 
    else if(request.equals("QUIT")){
    System.err.println("Program ended");
    }

    System.out.println(tokens);
    out.flush();
    }
}

public class Client {

public static void main(String[] args) throws IOException {
     Socket s = new Socket("localhost", 6789);
     InputStream instream = s.getInputStream();
     OutputStream outstream = s.getOutputStream();
     Scanner in = new Scanner(instream);
     PrintWriter out = new PrintWriter(outstream);
     String request = "SUBMIT hello \n";
     out.print(request);
     out.flush();
     String response = in.nextLine();
     System.out.println("Token: " + response);
     s.close();
    }

}

Вывод:

Сервер работает. Ожидание подключения клиента...

Клиент подключен

Полученный запрос: ОТПРАВИТЬ

hello добавлено в список

[Здравствуйте]

Клиент отключен. Ожидание нового клиента для подключения...

Клиент подключен

Полученный запрос: ОТПРАВИТЬ

привет в список

[Здравствуй]

Клиент отключен. Ожидание нового клиента для подключения...

Таким образом, у меня есть сервер, и клиент может подключиться к нему и ПОДПИСАТЬ маркер для arraylist, но каждый раз, когда новый клиент добавляет токен в список, он просто заменяет старый, а не добавляет в массив. [привет] вместо [hello] вместо [hello, привет] заменяет [hello].

Для запросов REMOVE и QUIT у меня действительно нет идеи, как заставить их работать правильно.

Любая помощь приветствуется.

Теги:
arraylist

1 ответ

1
Лучший ответ

Мне кажется, что это потому, что вы объявляете новый ArrayList каждый раз, когда клиент запрашивает эту услугу. вы вызываете run, который вызывает Request, который каждый раз объявляет новый ArrayList.

PS: измените имя метода Request, следует начинать с нижнего регистра: request()

  • 0
    Забыл дать вам возможное решение: просто объявите ваш ArrayList как переменную класса вместо того, чтобы объявлять его как локальный для request метода
  • 0
    Спасибо, SUBMIT и REMOVE теперь работают довольно хорошо.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню