需求:實時獲取當前客戶端連接數。
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 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());
}
}
幾行代碼即可實現生產級連接計數,Netty 方案更適合高併發場景。