在远程命令行解释器中处理从用户和服务器的响应读取命令的好方法是什么?

时间:2018-11-29 15:39:54

标签: java command-line-interface

我正在实现一个客户端软件,该软件可以让用户输入命令,将其发送到服务器,服务器解释它们并将结果发送到客户端。这是我遇到的问题,我有一个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;

在此期间,客户端将在发送命令关闭命令(以关闭服务器)时直接停止,以防止用户输入其他命令。 我正在寻找一种更有效的方法来管理命令和添加ping命令(但是我需要在关闭命令之前添加if),也许使用更多的OOP,但我不知道如何做。

2 个答案:

答案 0 :(得分:0)

我认为您应该先尝试Spring Shell,然后再尝试从头开始制作自己的内容。它非常模块化,您可以创建将命令发送到远程服务器的后端处理程序。

答案 1 :(得分:0)

使用无限循环并根据用户输入或服务器响应将其中断

这里是一个示例,该示例不将退出/关闭命令发送到服务器,而是仅停止客户端。如果您需要将所有命令发送到服务器并仅根据服务器响应停止,则只需从while循环中删除if语句

    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

    }