code: public CompletableFuture<Map<InetSocketAddress, List<String>>> getRpcNodeWebSocketAddresses(final Serializable userid) {
          CompletableFuture<Collection<InetSocketAddress>> sncpFuture = getRpcNodeAddresses(userid);
          return sncpFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
              if (logger.isLoggable(Level.FINEST)) logger.finest("websocket found userid:" + userid + " on " + addrs);
              if (addrs == null || addrs.isEmpty()) return CompletableFuture.completedFuture(new HashMap<>());
              CompletableFuture<Map<InetSocketAddress, List<String>>> future = null;
              for (final InetSocketAddress nodeAddress : addrs) {
                  CompletableFuture<Map<InetSocketAddress, List<String>>> mapFuture = getWebSocketAddresses(nodeAddress, userid)
                      .thenCompose((List<String> list) -> CompletableFuture.completedFuture(Utility.ofMap(nodeAddress, list)));
                  future = future == null ? mapFuture : future.thenCombine(mapFuture, (a, b) -> Utility.merge(a, b));
              }
              return future == null ? CompletableFuture.completedFuture(new HashMap<>()) : future;
          });
      }
docs: 获取在线用户的详细连接信息 <br>
  Map.key 为 SNCP节点地址, 含值为null的key表示没有分布式
  Map.value 为 用户客户端的IP
  
  @param userid Serializable
  
  @return 地址集合