任务管理器 (java)

Task manager (java)

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

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

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

服务器class:

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 + "...");
   
}

}

任务class:

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 class:

public class Main {

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

}

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

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

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

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

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

这里@Data是一个Lombok注解,它提供了getters/setters/default构造函数/toString/hashCode/equals.[=16=的样板代码]

然后从 JSON 中反序列化此类 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());