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