From 0d86a0e2db409b69e77b15acd6b96e758cc2ccb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=81=A9=E5=BE=B7?= <2026391459@qq.com> Date: Fri, 5 Dec 2025 11:21:45 +0800 Subject: [PATCH] echo-server --- .../java/com/example/echo/EchoClient.java | 2 +- .../java/com/example/echo/EchoServer.java | 76 +++++++++++++------ 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/example/echo/EchoClient.java b/src/main/java/com/example/echo/EchoClient.java index 12bf370..a1c2dd0 100644 --- a/src/main/java/com/example/echo/EchoClient.java +++ b/src/main/java/com/example/echo/EchoClient.java @@ -18,7 +18,7 @@ public class EchoClient { BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) { System.out.println("已连接到Echo服务器: " + SERVER_HOST + ":" + SERVER_PORT); - System.out.println("输入消息发送到服务器 (输入 'bye' 断开连接):"); + System.out.println("输入消息发送到服务器 (输入 'bye' 断开连接, 输入 'TIME' 获取服务器时间):"); String userInput; while ((userInput = stdIn.readLine()) != null) { diff --git a/src/main/java/com/example/echo/EchoServer.java b/src/main/java/com/example/echo/EchoServer.java index f55f684..65f3cd5 100644 --- a/src/main/java/com/example/echo/EchoServer.java +++ b/src/main/java/com/example/echo/EchoServer.java @@ -2,22 +2,26 @@ package com.example.echo; import java.io.*; import java.net.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** - * 单客户端Echo服务器 - * 这个服务器一次只处理一个客户端连接 + * 多客户端Echo服务器 + * 支持多个客户端同时连接,支持TIME命令返回系统时间 */ public class EchoServer { private static final int PORT = 8888; private ServerSocket serverSocket; private boolean running = false; private ExecutorService executor; + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public EchoServer() { - executor = Executors.newSingleThreadExecutor(); + // 使用线程池支持多客户端 + executor = Executors.newCachedThreadPool(); } /** @@ -26,57 +30,83 @@ public class EchoServer { public void start() throws IOException { serverSocket = new ServerSocket(PORT); running = true; - System.out.println("Echo Server已启动,监听端口: " + PORT); + System.out.println("[" + getCurrentTime() + "] Echo Server已启动,监听端口: " + PORT); - // 等待客户端连接 - System.out.println("等待客户端连接..."); - Socket clientSocket = serverSocket.accept(); - System.out.println("客户端已连接: " + clientSocket.getRemoteSocketAddress()); - - handleClient(clientSocket); + // 持续接受客户端连接 + while (running) { + try { + System.out.println("[" + getCurrentTime() + "] 等待客户端连接..."); + Socket clientSocket = serverSocket.accept(); + System.out.println("[" + getCurrentTime() + "] 新客户端连接: " + clientSocket.getRemoteSocketAddress()); + + // 为每个客户端创建独立的处理线程 + executor.submit(() -> handleClient(clientSocket)); + } catch (IOException e) { + if (running) { + System.err.println("[" + getCurrentTime() + "] 接受客户端连接时发生错误: " + e.getMessage()); + } + } + } } /** * 处理客户端连接 */ private void handleClient(Socket clientSocket) { + String clientAddress = clientSocket.getRemoteSocketAddress().toString(); + try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) { String inputLine; - System.out.println("开始与客户端通信..."); + System.out.println("[" + getCurrentTime() + "] 开始与客户端 " + clientAddress + " 通信..."); while ((inputLine = in.readLine()) != null) { + System.out.println("[" + getCurrentTime() + "] 收到来自 " + clientAddress + " 的消息: " + inputLine); + if ("bye".equalsIgnoreCase(inputLine.trim())) { - System.out.println("客户端请求断开连接"); + System.out.println("[" + getCurrentTime() + "] 客户端 " + clientAddress + " 请求断开连接"); break; } - System.out.println("收到消息: " + inputLine); - // 将收到的消息回显给客户端 - out.println("Echo: " + inputLine); + // 检查是否是TIME命令 + if ("TIME".equalsIgnoreCase(inputLine.trim())) { + String currentTime = getCurrentTime(); + out.println("服务器时间: " + currentTime); + System.out.println("[" + getCurrentTime() + "] 向客户端 " + clientAddress + " 返回时间: " + currentTime); + } else { + // 将收到的消息回显给客户端 + out.println("Echo: " + inputLine); + } } } catch (IOException e) { - System.err.println("处理客户端连接时发生错误: " + e.getMessage()); + System.err.println("[" + getCurrentTime() + "] 处理客户端 " + clientAddress + " 连接时发生错误: " + e.getMessage()); } finally { - try { - clientSocket.close(); - System.out.println("客户端连接已关闭"); - } catch (IOException e) { - System.err.println("关闭客户端连接时发生错误: " + e.getMessage()); - } + // 按照要求删除 clientSocket.close() 来观察问题 + System.out.println("[" + getCurrentTime() + "] 客户端 " + clientAddress + " 连接处理完成(未显式关闭socket)"); + // 注意:这里故意不调用 clientSocket.close() 来观察资源泄漏问题 } } + /** + * 获取当前时间字符串 + */ + private String getCurrentTime() { + return LocalDateTime.now().format(TIME_FORMATTER); + } + /** * 停止服务器 */ public void stop() throws IOException { running = false; + System.out.println("[" + getCurrentTime() + "] 正在停止服务器..."); + if (serverSocket != null && !serverSocket.isClosed()) { serverSocket.close(); } + executor.shutdown(); try { if (!executor.awaitTermination(5, TimeUnit.SECONDS)) { @@ -85,7 +115,7 @@ public class EchoServer { } catch (InterruptedException e) { executor.shutdownNow(); } - System.out.println("服务器已停止"); + System.out.println("[" + getCurrentTime() + "] 服务器已停止"); } public static void main(String[] args) { -- Gitee