Socket兼容IP和域名的原因

本文涉及的产品
.cn 域名,1个 12个月
简介: Socket兼容IP和域名的原因


测试代码

//将172.16.12.171 替换为 xingyun25 打印结果一致
Socket sock = new Socket("172.16.12.171",12331); 
InetAddress netAddress = sock.getInetAddress();
System.out.println(netAddress.getHostName());
System.out.println(netAddress.getHostAddress());
sock.close();

打印结果

xingyun25
172.16.12.171

查看 Socket 方法

 public Socket(String host, int port) throws UnknownHostException, IOException
    {
       //host != null 因此第一个参数为new InetSocketAddress(host, port)
       this(host != null ? new InetSocketAddress(host, port) :
             new InetSocketAddress(InetAddress.getByName(null), 
             //第二个参数 (SocketAddress) null 
             //第三个参数 true             (SocketAddress) null, true);
    }


查看 this 构造方法


private Socket(SocketAddress address, SocketAddress localAddr,
                   boolean stream) throws IOException {
    setImpl();
    // backward compatibility
if (address == null)
        throw new NullPointerException();
    try {
        createImpl(stream);
if (localAddr != null)
            //localhost/127.0.0.1
            bind(localAddr);
        //建立连接
        connect(address);
    } catch (IOException | IllegalArgumentException | SecurityException e) {
        try {
            close();
        } catch (IOException ce) {
            e.addSuppressed(ce);
        }
        throw e;
    }
}

对于 setImpl 方法


void setImpl() {
if (factory != null) {
        impl = factory.createSocketImpl();
        checkOldImpl();
    } else {
        // No need to do a checkOldImpl() here, we know it's an up to date        // SocketImpl!        impl = new SocksSocketImpl();    }    //Impl SET Socket     if (impl != null)        impl.setSocket(this);}

对于 createImpl 方法


// SocketImpl impl :The implementation of this Socket. 
void createImpl(boolean stream) throws SocketException {
if (impl == null)
        setImpl();
    try {
        impl.create(stream);
        created =true;
    } catch (IOException e) {
        throw new SocketException(e.getMessage());
    }
}

查看InetSocketAddress方法通过IP和域名创建有何不同


 public InetSocketAddress(String hostname, int port) {
        checkHost(hostname);
        InetAddress addr = null;
    String host = null;
        try {
            addr = InetAddress.getByName(hostname);
        } catch(UnknownHostException e){
           host = hostname;
        }
        //实际构造了 InetSocketAddressHolder 
        holder = new InetSocketAddressHolder(host, addr, checkPort(port));
    }
connect 过程中实际使用的是 InetAddress
 private InetSocketAddressHolder(String hostname, InetAddress addr, int port) {
            this.hostname = hostname;
             this.addr = addr;
            this.port = port;
}

————————————————


相关文章
|
5月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
48 1
|
2月前
|
网络协议 安全
网络中IP地址与域名系统
网络中IP地址与域名系统
47 3
|
6月前
|
缓存 网络协议 安全
【计算巢】DNS 解析过程详解:域名如何转换为 IP 地址
【5月更文挑战第31天】DNS(域名系统)将人类可读的域名转换为IP地址,涉及本地DNS缓存、层次化DNS服务器系统,包括根DNS、顶级域名DNS和权威DNS。当查询域名时,通过DNS服务器间的交互找到对应IP并返回给浏览器。Python示例展示了DNS查询过程。尽管DNS面临安全挑战,如欺骗和缓存中毒,采取安全措施可确保其稳定性和安全性。它是互联网的重要基础,连接域名与IP,支持便捷的网络访问。
197 0
|
6月前
|
网络协议 Java
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
94 0
|
4月前
|
Linux 网络架构
通过route , tracert , traceroute 查看本地路由配置及访问ip或域名时经过的路由信息
通过route , tracert , traceroute 查看本地路由配置及访问ip或域名时经过的路由信息
454 2
|
3月前
|
域名解析 缓存 负载均衡
在Linux中,自定义解析域名的时候,可以编辑哪个⽂件?是否可以⼀个ip对应多个域名?是否⼀个域名对应多个ip?
在Linux中,自定义解析域名的时候,可以编辑哪个⽂件?是否可以⼀个ip对应多个域名?是否⼀个域名对应多个ip?
|
4月前
|
Web App开发
软件开发常见流程之移动端调试方法,利用Chrome(谷歌浏览器)的模拟手机调试,搭建本地Web服务器,手机和服务器在一个局域网,通过手机访问服务器,使用服务器,利用ip实现域名访问
软件开发常见流程之移动端调试方法,利用Chrome(谷歌浏览器)的模拟手机调试,搭建本地Web服务器,手机和服务器在一个局域网,通过手机访问服务器,使用服务器,利用ip实现域名访问
|
5月前
网络编程中的互联网协议 , IP地址 , 域名 , 端口 , 架构 , 网页数据请求 , 响应码
网络编程中的互联网协议 , IP地址 , 域名 , 端口 , 架构 , 网页数据请求 , 响应码
|
5月前
|
运维 Serverless Docker
Serverless 应用引擎产品使用合集之想使用IP地址而不是临时域名进行访问如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
5月前
ngin IP跳域名 域名跳域名 if多判断
ngin IP跳域名 域名跳域名 if多判断
21 0