Java Socket服务端如何配置运行一段时间后停止接收新客户端连接
Java Socket服务端限时接收新连接实现方案
核心实现思路
要实现指定时长后停止接收新连接、保留已有连接正常运行的需求,核心逻辑是将「服务端监听端口的ServerSocket生命周期」和「已建立的客户端连接Socket生命周期」解耦:
- 服务启动时记录初始时间,预设停止接收新连接的时间阈值
- 启动独立定时任务,到达阈值后主动关闭监听用的
ServerSocket,停止端口监听 - 已建立的客户端连接由独立子线程持有和处理,与
ServerSocket无绑定关系,关闭ServerSocket不会影响已有连接的正常通信
完整代码示例
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TimedSocketServer { // 服务监听端口 private static final int PORT = 8080; // 启动后多久停止接收新连接,单位:秒 private static final int STOP_ACCEPT_AFTER_SECONDS = 30; public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(PORT); System.out.println("服务端启动,开始监听端口:" + PORT); // 注册定时任务,到点后关闭ServerSocket停止接收新连接 Executors.newSingleThreadScheduledExecutor().schedule( () -> { try { serverSocket.close(); System.out.println("已到预设时间,停止接收新客户端连接"); } catch (IOException e) { e.printStackTrace(); } }, STOP_ACCEPT_AFTER_SECONDS, TimeUnit.SECONDS ); // 循环接收新连接 while (!serverSocket.isClosed()) { try { Socket clientSocket = serverSocket.accept(); System.out.println("接收到新客户端连接:" + clientSocket.getRemoteSocketAddress()); // 每个新连接启动独立线程处理,和主线程监听逻辑解耦 new Thread(new ClientHandler(clientSocket)).start(); } catch (SocketException e) { // ServerSocket被关闭时会触发该异常,属于预期逻辑,直接退出循环即可 break; } } } // 客户端连接处理逻辑 static class ClientHandler implements Runnable { private final Socket clientSocket; public ClientHandler(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { try { // 此处替换为你自己的业务处理逻辑,示例为模拟长连接保持1分钟后关闭 System.out.println("处理客户端请求:" + clientSocket.getRemoteSocketAddress()); TimeUnit.MINUTES.sleep(1); System.out.println("客户端请求处理完成,关闭连接:" + clientSocket.getRemoteSocketAddress()); clientSocket.close(); } catch (Exception e) { e.printStackTrace(); } } } }
关键注意事项
- 若需要给新连接返回明确的拒绝提示而非直接丢弃请求,可以不用关闭
ServerSocket,改为每次accept()到新连接后,先写入拒绝报文再立即关闭该新连接即可 - 处理
SocketException时注意区分是主动关闭ServerSocket触发的预期异常,还是服务运行异常,避免误杀整个服务进程 - 客户端处理线程可根据业务需求使用线程池管理,避免大量连接时线程资源耗尽
内容的提问来源于stack exchange,提问作者Henrique Jesus
相关产品推荐
相关产品推荐

