package org.limewire.io; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; /** * Provides a default {@link IpPort} implementation to return IP information * ({@link InetAddress}, host name, and port number). <code>IpPortImpl</code> * uses constructor arguments (either directly or via parsing) to set IP * information. */ public class IpPortImpl implements IpPort { private final InetSocketAddress addr; private final String addrString; /** Constructs a new IpPort based on the given SocketAddress. */ public IpPortImpl(InetSocketAddress addr) { this(addr, addr.getAddress().getHostAddress()); } /** Constructs a new IpPort with the given SocketAddress, explicitly defining the string-addr. */ public IpPortImpl(InetSocketAddress addr, String addrString) { this.addr = addr; this.addrString = addrString; } /** Constructs a new IpPort using the addr & port. */ public IpPortImpl(InetAddress addr, int port) { this(new InetSocketAddress(addr, port)); } /** Constructs a new IpPort using the given host & port.*/ public IpPortImpl(String host, int port) throws UnknownHostException { this(new InetSocketAddress(InetAddress.getByName(host), port), host); } /** Constructs a new IpPort using the given byte[] & port. */ public IpPortImpl(byte[] addr, int port) { this(new InetSocketAddress(getAddressFromBytes(addr), port), asString(addr)); } /** Constructs an IpPort using the given host:port */ public IpPortImpl(String hostport) throws UnknownHostException { int colonIdx = hostport.indexOf(":"); if(colonIdx == hostport.length() - 1) throw new UnknownHostException("invalid hostport: " + hostport); String host = hostport; int port = 80; if(colonIdx != -1) { host = hostport.substring(0, colonIdx); try { port = Integer.parseInt(hostport.substring(colonIdx+1).trim()); } catch(NumberFormatException nfe) { throw new UnknownHostException("invalid hostport: " + hostport); } } this.addr = new InetSocketAddress(InetAddress.getByName(host), port); this.addrString = host; } public InetSocketAddress getInetSocketAddress() { return addr; } public InetAddress getInetAddress() { return addr.getAddress(); } public String getAddress() { return addrString; } public int getPort() { return addr.getPort(); } @Override public String toString() { return "host: " + getAddress() + ", port: " + getPort(); } private static String asString(byte[] addr) { // xxx.xxx.xxx.xxx => 15 chars StringBuilder sb = new StringBuilder(19); for(int i = 0; i < addr.length; i++) { sb.append(addr[i] & 0xFF); if(i != addr.length - 1) sb.append("."); } return sb.toString(); } private static InetAddress getAddressFromBytes(byte[] address) { try { return InetAddress.getByAddress(address); } catch(UnknownHostException uhe) { throw new IllegalArgumentException("invalid address: " + asString(address)); } } }