/* * Copyright 2014, The Sporting Exchange Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.betfair.cougar.netutil; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; public class InetSocketAddressUtils { private InetSocketAddressUtils() { //It makes no sense to instantiate this class. } /** * Returns a string representation of the specified socket address * in the form <IPADDRESS>:<PORT> * * @param socketAddress the socket address */ public static String asString(SocketAddress socketAddress) { final InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress; final InetAddress inetAddress = inetSocketAddress.getAddress(); String host = inetSocketAddress.getHostName(); if (inetAddress != null) { host = inetAddress.getHostAddress(); } return host + ":" + inetSocketAddress.getPort(); } /** * <p>Creates an array of InetSocketAddress given an array of String</p> * * @param addresses the addresses, which may be a mixture of any of the formats supported by * createInetSocketAddress(String address) */ public static InetSocketAddress[] parseAddressList(String[] addresses) { InetSocketAddress[] isa = new InetSocketAddress[addresses.length]; for (int x = 0; x < addresses.length; x++) { isa[x] = createInetSocketAddress(addresses[x]); } return isa; } /** * <p>Creates an InetSocketAddress given a host and optional port in a single String</p> * <p/> * <p>This allows either IP4 or IP6 addresses (including port) to be provided as Strings as per rfc2732</p> * * @param address the address in one of the following formats (the braces '[]'and colon ':' are literal here): * host<br> * [host]<br> * [host]:port<br> * [host]port<br> * ip4host:port<br> * <p>Assumes port 0 if non is specified.</p> * <p/> * <p> As per java.net.InetSocketAddress * A port number of zero will let the system pick up an ephemeral port in a bind operation.</p> */ public static InetSocketAddress createInetSocketAddress(String address) { return createInetSocketAddress(address, 0); } /** * <p>Creates an InetSocketAddress given a host and optional port in a single String * <p/> * <p>This allows either IP4 or IP6 addresses (including port) to be provided as Strings as per rfc2732</p> * * @param address the address in one of the following formats (the braces '[]'and colon ':' are literal here): * host<br> * [host]<br> * [host]:port<br> * [host]port<br> * ip4host:port<br> * @param defaultPort The default port to be used ONLY IF the string does not specify a port * @see java.net.InetSocketAddress */ public static InetSocketAddress createInetSocketAddress(String address, int defaultPort) { String original = address.trim(); String host = original; int port = defaultPort; if (host.startsWith("[")) { // it is an address in [host] or [host]port format String[] s = original.split("\\]"); if (s.length > 1) { if (s[1].startsWith(":")) { s[1] = s[1].substring(1); } port = computePort(s[1], 0); } host = s[0].substring(1); } if (host.indexOf(":") == host.lastIndexOf(":") && (host.indexOf(":") > -1)) { //There is exactly 1 ':' in the string, hence this is an IP4 address which includes a port String[] s = original.split("\\:"); host = s[0]; if (s.length > 1) { port = computePort(s[1], 0); } } return new InetSocketAddress(host, port); } private static int computePort(String s, int i) { try { return Integer.valueOf(s); } catch (NumberFormatException e) { return i; } } }