首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Socket 服務端統計連接數:AtomicInteger 計數器最簡方案

     編輯:程式設計綜合問答

需求:實時獲取當前客戶端連接數。

最簡實現:原子計數器

public class SocketServer {
    private static final AtomicInteger onlineCount = new AtomicInteger(0);
    private static final Set connections = Collections.synchronizedSet(new HashSet<>());

    public void start(int port) throws IOException {
        ServerSocket server = new ServerSocket(port);
        while (true) {
            Socket client = server.accept();
            connections.add(client);
            int current = onlineCount.incrementAndGet(); // 線程安全 +1
            System.out.println("新連接,當前在線: " + current);
            
            new Thread(() -> handle(client)).start();
        }
    }

    private void handle(Socket socket) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            String line;
            while ((line = in.readLine()) != null) {
                // 業務處理...
            }
        } catch (IOException e) {
            // 忽略斷開異常
        } finally {
            connections.remove(socket);
            int current = onlineCount.decrementAndGet(); // 線程安全 -1
            System.out.println("斷開連接,當前在線: " + current);
            try { socket.close(); } catch (IOException ignored) {}
        }
    }
}

進階:Netty 內建連接管理

// Netty 4.x
ChannelGroup allChannels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

@ChannelHandler.Sharable
public class ConnectionCounter extends ChannelInboundHandlerAdapter {
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        allChannels.add(ctx.channel());
        System.out.println("在線: " + allChannels.size());
    }
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        allChannels.remove(ctx.channel());
        System.out.println("在線: " + allChannels.size());
    }
}

關鍵點

  • **原子操作** (`AtomicInteger` / `LongAdder`) 避免並發計數錯誤。
  • **連接集合** (`ConcurrentHashMap.newKeySet()` / `ChannelGroup`) 便於廣播/踢人/統計詳情。
  • **異常/關閉路徑** 必須 `decrementAndGet()`,否則計數洩漏。

幾行代碼即可實現生產級連接計數,Netty 方案更適合高併發場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved