package com.ilivoo.jdk.java.net;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

/**
 * 1. 此类继承自SocketAddress表示一种抽象协议地址的一个父类， 它并不针对某种具体的协议， 而其具体的协议应该要实现此抽象类。
 * 2. 此类表示特定Internet的SocketAddress， 由ip+port组成， 并且它还可以是 主机名+端口号， 这其实也是InetAddress来决定的。
 * 3. 其实从这里我们完全可以看一种层次关系， 当我们操作URL的时候， 其实它也可以看做是InetSocketAddress的一个对于Inet更加完善
 *    的操作某个资源的地址。 
 * 4. 它提供不可变对象，供套接字用于绑定、连接或用作返回值。 
 * 5. 通配符 是一个特殊的本地 IP 地址。它通常表示“任何”，只能用于 bind 操作。
 * 6. 通过InetSocketAddress我们可以创建一个不使用立即解析的一个InetSocketAddress, 这不像是InetAddress， 创建它的实例的时候
 *    它一定会立即创建一个实例。
 * @author 37.com
 *
 */
public class InetSocketAddressTest {
	public static void main(String[] args) {
		InetSocketAddressTest isat = new InetSocketAddressTest();
		isat.testConstructor();
		isat.testCreateUnresolved();
		isat.testGetxx();
	}
	
	/**
	 * 1. 可以看到， 当我们使用构造方法的形式去创建一个InetSocketAddress的时候， 他会立即去验证当前InetSocketAddress对应
	 *    的InetAddress是否存在， 并创建InetAddress的相关实例， 再通过创建它来创建InetSocketAddress。 
	 * 2. 所以来说这是一种立即解析的过程， 所以应当考虑是否需要使用。
	 */
	public void testConstructor(){
		try {
			InetSocketAddress isa = new InetSocketAddress(11111);
			InetSocketAddress isa2 = new InetSocketAddress(InetAddress.getByName("www.baidu.com"), 80);
			InetSocketAddress isa3 = new InetSocketAddress("www.baidu.com", 80);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 1. 创建一个为解析的InetSocketAddress， 也就是说当前并不知道此InetAddress是否存在。等到真正使用的时候才去验证是否存在。
	 */
	public void testCreateUnresolved(){
		InetSocketAddress isa = InetSocketAddress.createUnresolved("www.baidu.com", 80);
	}
	
	/**
	 * 1. 从这里我们可以看到它并不会去解析这个主机是否存在， 一旦我们创建了这个对象， 那么它本身是无法再对这个主机进行一个地址
	 *    解析的， 因为此时已经完全不能操作当前的这个主机本身了， 只有当我们使用的时候通过主机名来进行操作。
	 */
	public void testGetxx(){
		InetSocketAddress isa = InetSocketAddress.createUnresolved("www.baidu.com", 80);
		System.out.println(isa.getHostName());
//		System.out.println(isa.getHostString());
		System.out.println(isa.getAddress());//null
		System.out.println(isa.getPort());
		
		System.out.println(isa.isUnresolved());
	}
}
