【问题标题】:Task manager (java)任务管理器 (java)
【发布时间】:2022-02-03 20:22:53
【问题描述】:

程序必须接受通过服务器从列表中添加和删除任务的请求。启动后,服务器接受无限循环的连接,并从中读取一行包含以下格式的 json:

{ "type": "ADD", "task": "Название задачи" }

其中 type 是操作的类型(ADD 或 REMOVE),task 是任务本身。处理请求后,控制台中应显示所有任务的列表。连接后,我的控制台给出了 null。有什么问题?

服务器类:

public class TodoServer {


public TodoServer(int port, Todos todos) {
    while (true) {
        try (ServerSocket serverSocket = new ServerSocket(port);
             Socket clientSocket = serverSocket.accept();
             PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {

            System.out.println("New connection accepted");


            final String json = in.readLine();

            Gson gson = new Gson();
            String type = gson.fromJson("\"type\"", String.class);
            String task = gson.fromJson("\"task\"", String.class);
            if (type.equals("ADD")) {
                todos.addTask(task);
            } else if (type.equals("REMOVE")) {
                todos.removeTask(task);
            }
            System.out.println(todos.getAllTasks());
        } catch (IOException e) {
            System.out.println("Соединение разорвано");
        }
    }
}

public void start() throws IOException {
    int port = 8989;
    System.out.println("Starting server at " + port + "...");
   
}

}

任务类:

public class Todos {
static ArrayList <String> tasks = new ArrayList<>();


public void addTask(String task) {
    tasks.add(task);
    Collections.sort(tasks);
}

public void removeTask(String task) {
    tasks.remove(task);//...
}

public String getAllTasks() {
    return tasks.toString();
}

public ArrayList<String> getListTask() {
    return tasks;
}

}

服务器启动的Main类:

public class Main {

public static void main(String[] args) throws IOException {
    Todos todos = new Todos();
    TodoServer server = new TodoServer(8989, todos);
    server.start();
}

}

【问题讨论】:

    标签: java json server


    【解决方案1】:

    根据您在此处显示的内容,您对 JSON 的解析和使用是问题所在。作为起点,您阅读了 String json,但随后什么也不做。

    您需要将该值解析为一个对象,然后从中访问值(就像您访问字典或地图一样)。如何使用 GSON 做到这一点应该有大量现成的文档和示例。

    如果您使用 IDE 进行开发,我还建议您将其作为尝试调试器的绝佳机会 - 设置断点、检查值等!

    【讨论】:

      【解决方案2】:

      最好定义一个简单的 POJO 来表示一个任务:

      @Data
      class MyTask {
          private String type;
          private String task;
      }
      

      这里的@Data是一个Lombok注解,它提供了getters/setters/default constructor/toString/hashCode/equals的样板代码。

      然后根据需要对此类POJO的实例进行反序列化处理:

      final String json = in.readLine();
      
      MyTask task = new Gson().fromJson(json, MyTask.class);
      
      if ("ADD".equals(task.getType())) {
          todos.addTask(task.getTask());
      } else if ("REMOVE".equals(task.getType())) {
          todos.removeTask(task.getTask());
      }
      System.out.println(todos.getAllTasks());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多