Каков хороший способ обработки командного чтения из ответа пользователя и сервера в удаленном интерпретаторе командной строки? - PullRequest
0 голосов
/ 29 ноября 2018

Я внедряю программное обеспечение на стороне клиента, которое позволяет пользователю вводить команды, отправлять их на сервер, сервер интерпретирует их и отправляет результат клиенту.Вот где я застрял, у меня есть цикл while, который получает ответы от сервера до тех пор, пока не закончится соединение.

try(Socket socket = new Socket(hostname, port);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))){

    System.out.println("Connected to " + hostname + ":" + port + " !");

    Scanner scanner = new Scanner(System.in);
    String command = scanner.nextLine();
    String fromServer = null;
    int status;
    HashMap<String, String> response;
    long start = 0;

    System.out.println("C:" + command);

    if (command.toLowerCase().equals("exit")) return;

    out.println(command);

    if (command.toLowerCase().equals("shutdown")) return;

    out.println();

    while ((fromServer = in.readLine()) != null) {

        // Here's my problem
        response = parseResponse(fromServer);

        if (response.containsKey("response")) response.put("response", response.get("response").replaceAll("\\\\n", "\n"));

        try {

            status = Integer.parseInt(response.get("status"));

        } catch (NumberFormatException e){

            status = Status.RESPONSE_CORRUPTED;

        }

        System.out.println("S:" + status + (response.get("response") != null ? "\n" + response.get("response") : ""));
        command = scanner.nextLine();
        System.out.println("C:" + command);
        out.println(command);

    }

} catch (IOException e){

    System.out.println("Server isn't connected, try again later.");

}

Реальная проблема заключается в том, что мне нужно поставить

if (command.toLowerCase().equals("exit")) return;

out.println(command);

if (command.toLowerCase().equals("shutdown")) return;

out.println();

передкакое-то время, так что в коде есть три out.println (), в то время как один будет более «логичным», и мне нужно указать

if (command.toLowerCase().startsWith("shutdown") && fromServer.equalsIgnoreCase("0") || status == Status.RESPONSE_CORRUPTED) break;

, в то время как клиент останавливается непосредственно при отправке команды shutdown(для выключения сервера), чтобы пользователь не мог ввести другую команду.Я ищу более эффективный способ управления командами и добавления команды ping (но мне нужно добавить if перед выключением), возможно, использую больше ООП, но я не вижу, как это сделать.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Используйте бесконечный цикл и прерывайте его на основе ввода пользователя или ответа сервера.

Вот пример, который не отправляет команды выхода / выключения на сервер, а только останавливает клиента,Если вам нужно отправить все команды на сервер и остановить только на основе ответа сервера, просто удалите оператор if из цикла while

    Scanner scanner = new Scanner(System.in);
    String command = null;
    while (true) {

        command = scanner.nextLine();

        if (command.toLowerCase().equals("exit") || command.toLowerCase().equals("shutdown")) {
            break;
        }

        out.print(command);
        out.flush();

        String response = in.readLine();

        // do something with the response (ex. stop the client by calling break or just print the response

    }
0 голосов
/ 29 ноября 2018

Я думаю, вам следует сначала попробовать Spring Shell , прежде чем пытаться создать свой собственный с нуля.Он довольно модульный, и вы можете создавать обработчики бэкэнда, которые отправляют команды на удаленный сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...