package com.juick.components.s2s; import org.apache.commons.lang3.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.Hashtable; import java.util.Random; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; /** * * @author ugnich */ public class DNSQueries { private static final Logger logger = LoggerFactory.getLogger(DNSQueries.class); private static Random rand = new Random(); public static InetSocketAddress getServerAddress(String hostname) { String host = hostname; int port = 5269; Hashtable env = new Hashtable<>(5); env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); try { DirContext ctx = new InitialDirContext(env); Attribute att = ctx.getAttributes("_xmpp-server._tcp." + hostname, new String[]{"SRV"}).get("SRV"); if (att != null && att.size() > 0) { int i = rand.nextInt(att.size()); String srv[] = att.get(i).toString().split(" "); port = NumberUtils.toInt(srv[2], 5269); host = srv[3]; } ctx.close(); } catch (NamingException e) { logger.info("SRV record for {} is not resolved, falling back to A record", hostname); } return new InetSocketAddress(host, port); } }