- public class OnlineUserCounter {
- private static SocketIOServer socketServer = null;
- /**
- * 在线用户数
- */
- public static Set<String> userSet = new HashSet<>(500);
- private static JSONObject result = new JSONObject();
- /**
- * 客户端计数
- */
- public static AtomicInteger clientCount = new AtomicInteger();
- private static SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- public static void startSocketIOServer() {
- try {
- Configuration config = new Configuration();
- InetAddress localHost;
- String localIp = "127.0.0.1";
- try {
- localHost = Inet4Address.getLocalHost();
- localIp = localHost.getHostAddress();
- } catch (Exception e) {
- ServiceLog.error(e);
- }
- String ip = AppHandle.getHandle(Constants.MODULE).getProperty("ONLINE_SERVER_IP", localIp);
- config.setHostname(ip);
- int port = Integer.parseInt(AppHandle.getHandle(Constants.MODULE)
- .getProperty("ONLINE_SERVER_PORT", "9092"));
- config.setPort(port);
- SocketConfig sockConfig = new SocketConfig();
- sockConfig.setReuseAddress(true);// 解决 SOCKET 服务端重启 "Address already in use" 异常
- sockConfig.setTcpKeepAlive(false);
- config.setSocketConfig(sockConfig);
- socketServer = new SocketIOServer(config);
- socketServer.addConnectListener(new ConnectListener() {
- @Override
- public void onConnect(SocketIOClient client) {
- int count = clientCount.incrementAndGet();
- HandshakeData handshakeData = client.getHandshakeData();
- String userCode = handshakeData.getSingleUrlParam("userCode");
- ServiceLog.debug(userCode + "connet, total count:" + count);
- addUser(userCode);
- sendOnlineMessage();
- }
- });
- socketServer.addDisconnectListener(new DisconnectListener() {
- @Override
- public void onDisconnect(SocketIOClient client) {
- if(clientCount.get()> 0) {
- clientCount.decrementAndGet();
- }
- HandshakeData handshakeData = client.getHandshakeData();
- String userCode = handshakeData.getSingleUrlParam("userCode");
- ServiceLog.debug(userCode + "disconnet, total count:" + clientCount.get());
- removeUser(userCode, client);
- sendOnlineMessage();
- }
- });
- socketServer.addEventListener("HEARTBEAT_EVENT", String.class, new DataListener<String>(){
- @Override
- public void onData(SocketIOClient client, String data, AckRequest ackSender) throws Exception {
- JSONObject dataJson = JSON.parseObject(data);
- String userCode = dataJson.getString("userCode");
- addUser(userCode);
- sendOnlineMessage();
- }
- });
- socketServer.start();
- }catch(Exception e) {
- ServiceLog.error("启动在线统计用户服务失败:" + e.getMessage(), e);
- }
- }
- private static void addUser(String userCode) {
- if(StringUtil.isEmpty(userCode)) {
- return;
- }
- if(!userSet.contains(userCode)) {
- userSet.add(userCode);
- }
- }
- private static void removeUser(String userCode, SocketIOClient client) {
- if(StringUtil.isEmpty(userCode)) {
- return;
- }
- userSet.clear();
- Collection<SocketIOClient> clients = socketServer.getAllClients();
- for (SocketIOClient c : clients) {
- if(c.getSessionId().equals(client.getSessionId())) {
- continue;
- }
- HandshakeData handshakeData = c.getHandshakeData();
- String uCode = handshakeData.getSingleUrlParam("userCode");
- userSet.add(uCode);
- }
- }
- private static void sendOnlineMessage() {
- Collection<SocketIOClient> clients = socketServer.getAllClients();
- //result.put("CLIENT_NUM", clientCount.get());
- result.put("ONLINE_NUM", userSet.size());
- for (SocketIOClient c : clients) {
- c.sendEvent("HEARTBEAT_EVENT", result);
- }
- }
- public static void stopSocketIOServer(){
- if(socketServer != null){
- socketServer.stop();
- socketServer = null;
- }
- }
- }
只需要在 ServletContextListener 初始化时调用:
来源: http://www.bubuko.com/infodetail-3065513.html