任务管理器 (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());
程序必须接受通过服务器从列表中添加和删除任务的请求。启动后,服务器在无限循环中接受连接并从中读取包含以下形式的 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());