Java如何在HTTP请求时做DNS解析?

简介: Java如何在HTTP请求时做DNS解析?

前言


网络传输数据协议无非就是TCP和UDP。在做HTTP请求时,传输层就是基于TCP协议,如下代码,其中的url参数就是统一资源定位器(Uniform Resource Locator)。


HttpPost httpPost = new HttpPost(url);

当HTTP请求Web服务器数据接口时,如果给的参数(url)带有服务器主机域名这种格式,必定通过DNS解析拿到Ip地址进而继续开启通道连接。那么如何进行解析的呢?下面通过源码分析的形式向大家展示。


源码分析


当请求连接时,才会使用Ip地址。因此我们将代码定位到CloseableHttpClient类的doExecute方法上来。


protected abstract CloseableHttpResponse doExecute(HttpHost target, HttpRequest request,
            HttpContext context) throws IOException, ClientProtocolException;

然后选择该接口的实现类AbstractHttpClient

1666243065722.jpg

看一下该类的UML图。

1666243090300.jpg

深入到该类的doExecute方法中,可以的看到:


out = CloseableHttpResponseProxy.newProxy(
                            director.execute(target, request, execContext));

点击execute方法,发现它实现了RequestDirector接口,我们再找其实现类DefaultRequestDirector。在方法中找到该代码,我们也会总结,只有当连接的时候才会用到Ip地址。


tryConnect(roureq, context);

可以看到这行代码,关键来了,该方法就是要开启网络连接。

managedConn.open(route, context, params);

看该方法的实现类DefaultClientConnectionOperator,在该类的openConnection方法中有如下代码,顾名思义,这就是解析域名的入口。


final InetAddress[] addresses = resolveHostname(target.getHostName());

看解析的实现类,来到了InetAddress,这个类想必都很明白了,是java.net包里的常用类,来到解析方法getAllByName0中,找到getAddressesFromNameService方法。

这个就是从域名服务器获取Ip地址的方法。OK了,细节后面就自己看吧。


addresses = getAddressesFromNameService(host, reqAddr);

其实遇到网络相关的问题,应该首先能够想到java.net包,网络程序开发离不开这个包。


测试


查看百度域名的Ip地址如下代码所示。

1666243217452.jpg

相关文章
|
12天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
14天前
|
Java
java原生发送http请求
java原生发送http请求
|
21天前
|
网络协议 Linux iOS开发
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
45 1
|
3天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
19 8
|
6天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
6天前
|
安全 网络安全 开发工具
对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
19 1
|
11天前
|
Java
Java 15 神秘登场:隐藏类解析未知领域
Java 15 神秘登场:隐藏类解析未知领域
15 0
|
11天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
33 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
26天前
|
域名解析 弹性计算 网络协议
阿里云DNS常见问题之确认域名是否在Private zone解析失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
26天前
|
域名解析 缓存 网络协议
阿里云DNS常见问题之新购域名阿里云DNS无法解析如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:

相关产品

  • 云解析DNS
  • 推荐镜像

    更多