jdk源码Java.net包详解
文章目录
一、Java.net包描述
java.net
包提供了实现网络应用程序所需的类。java.net
包可以大致分为两个部分:
低级API,处理以下抽象:
- 地址(Addresses):网络标识符,如IP地址。
- 套接字(Sockets):基本的双向数据通信机制。
- 接口(Interfaces):描述网络接口。
高级API,处理以下抽象:
- 统一资源标识符(URIs):表示统一资源标识符。
- 统一资源定位符(URLs):表示统一资源定位符。
- 连接(Connections):表示与URL指向的资源的连接。
地址
地址在java.net
API中被用作主机标识符或套接字端点标识符。
InetAddress
类是表示IP(Internet Protocol)地址的抽象。它有两个子类:
Inet4Address
:用于IPv4地址。Inet6Address
:用于IPv6地址。
但是,在大多数情况下,没有必要直接处理这些子类,因为InetAddress
抽象应该覆盖大部分所需的功能。
关于IPv6
并非所有系统都支持IPv6协议,虽然Java网络堆栈会尝试在可用时自动检测和使用IPv6,但也可以通过系统属性禁用其使用。在IPv6不可用或明确禁用的情况下,Inet6Address
将不再是大多数网络操作的有效参数。例如,当查找主机名时,InetAddress.getByName(java.lang.String)
等方法保证不返回Inet6Address
,但是通过传递文字可以创建这样的对象。在这种情况下,当使用Inet6Address
调用大多数方法时,会抛出异常。
套接字
套接字是在网络上建立机器之间通信链接的方式。java.net
包提供了4种类型的套接字:
Socket
:TCP客户端API,通常用于连接到远程主机。ServerSocket
:TCP服务器API,通常接受来自客户端套接字的连接。DatagramSocket
:UDP端点API,用于发送和接收数据报包。MulticastSocket
:用于处理多播组的DatagramSocket
子类。
使用TCP套接字进行发送和接收是通过InputStreams
和OutputStreams
完成的,可以通过Socket.getInputStream()
和Socket.getOutputStream()
方法获得它们。
接口
NetworkInterface
类提供了浏览和查询本地机器的所有网络接口(如以太网连接或PPP终结点)的API。可以通过该类检查任何本地接口是否配置为支持IPv6。
注意,所有符合规范的实现必须支持至少一个NetworkInterface
对象,该对象必须连接到网络或者是一个“回环”接口,只能与同一台机器上的实体通信。
高级API
java.net
包中的一些类提供了更高级别的抽象,并允许轻松访问网络上的资源。这些类包括:
URI
:表示统一资源标识符,如RFC 2396中所指定的。正如名称所示,这只是一个标识符,并不直接提供访问资源的方法。URL
:表示统一资源定位符,既是URI的旧概念,也是访问资源的手段。URLConnection
:从URL创建,并且是用于访问URL指向的资源的通信链接。这个抽象类将大部分工作委托给底层的协议处理程序,如http或https。HttpURLConnection
:是URLConnection
的子类,提供了一些特定于HTTP协议的附加功能。
建议的使用方式是使用URI
来标识资源,然后在访问资源时将其转换为URL
。从该URL,您可以获得URLConnection
进行精细控制,或直接获取InputStream
。
以下是一个示例:
URI uri = new URI("http://java.sun.com/");
URL url = uri.toURL();
InputStream in = url.openStream();
协议处理程序
正如提到的,URL和URLConnection依赖于必须存在的协议处理程序,否则将抛出异常。这是与仅标识资源的URI的主要区别,因此不需要访问协议处理程序。因此,虽然可以使用任何类型的协议方案(例如myproto://myhost.mydomain/resource/)创建URI,但类似的URL将尝试实例化指定协议的处理程序;如果不存在,则会抛出异常。
默认情况下,协议处理程序会动态从默认位置加载。然而,通过设置java.protocol.handler.pkgs系统属性,可以将其添加到搜索路径中。例如,如果将其设置为myapp.protocols,则URL代码在http的情况下首先尝试加载myapp.protocols.http.Handler,然后如果失败,则尝试加载默认位置的http.Handler。
请注意,Handler类必须是URLStreamHandler抽象类的子类。
二、接口概述
接口 | 描述 |
---|---|
ContentHandlerFactory | 内容处理器工厂接口。 |
CookiePolicy | Cookie策略接口,决定哪些Cookie应该被接受,哪些应该被拒绝。 |
CookieStore | Cookie存储接口,表示一个Cookie的存储。 |
DatagramSocketImplFactory | 数据报套接字实现工厂接口。 |
FileNameMap | 用于文件名和MIME类型字符串之间进行映射的简单接口。 |
ProtocolFamily | 表示通信协议的族。 |
SocketImplFactory | 套接字实现工厂接口。 |
SocketOption<T> | 与套接字关联的套接字选项。 |
SocketOptions | 获取/设置套接字选项的方法接口。 |
URLStreamHandlerFactory | URL流协议处理程序工厂接口。 |
三、类概述
类 | 描述 |
---|---|
Authenticator | Authenticator类表示一个知道如何为网络连接获取认证信息的对象。 |
CacheRequest | 表示ResponseCache中存储资源的通道。 |
CacheResponse | 表示从ResponseCache中检索资源的通道。 |
ContentHandler | ContentHandler抽象类是从URLConnection读取对象的所有类的超类。 |
CookieHandler | CookieHandler对象提供了将HTTP状态管理策略实现与HTTP协议处理程序连接起来的回调机制。 |
CookieManager | CookieManager是CookieHandler的具体实现,它将Cookie的存储与接受和拒绝Cookie的策略分离开来。 |
DatagramPacket | DatagramPacket类表示一个数据报包。 |
DatagramSocket | DatagramSocket类表示用于发送和接收数据报包的套接字。 |
DatagramSocketImpl | 抽象的数据报和多播套接字实现基类。 |
HttpCookie | HttpCookie对象表示一个HTTP cookie,用于在服务器和用户代理之间传递状态信息。 |
HttpURLConnection | 具有支持HTTP特定功能的URLConnection。 |
IDN | 提供将国际化域名(IDN)在正常的Unicode表示和ASCII兼容编码(ACE)表示之间进行转换的方法。 |
Inet4Address | Inet4Address类表示IPv4地址。 |
Inet6Address | Inet6Address类表示IPv6地址。 |
InetAddress | InetAddress类表示Internet协议(IP)地址。 |
InetSocketAddress | InetSocketAddress类实现了IP Socket Address(IP地址+端口号),也可以是一对(主机名+端口号),在这种情况下将尝试解析主机名。 |
InterfaceAddress | InterfaceAddress类表示网络接口地址。 |
JarURLConnection | 连接到Java ARchive(JAR)文件或JAR文件中的条目的URL连接。 |
MulticastSocket | 多播数据报套接字类,用于发送和接收IP多播数据包。 |
NetPermission | 用于各种网络权限的类。 |
NetworkInterface | NetworkInterface类表示由名称和分配给该接口的IP地址列表组成的网络接口。 |
PasswordAuthentication | PasswordAuthentication类是一个数据持有者,由Authenticator使用。 |
Proxy | Proxy类表示代理设置,通常是类型(http、socks)和套接字地址。 |
ProxySelector | 在连接到URL引用的网络资源时,选择要使用的代理服务器(如果有)。 |
ResponseCache | 表示URLConnection缓存的实现。 |
SecureCacheResponse | 表示最初通过安全方式(如TLS)检索的缓存响应。 |
ServerSocket | ServerSocket类实现了服务器套接字。 |
Socket | Socket类实现了客户端套接字(也称为“套接字”)。 |
SocketAddress | SocketAddress类表示没有协议附件的套接字地址。 |
SocketImpl | SocketImpl抽象类是所有实际实现套接字的类的公共超类。 |
SocketPermission | SocketPermission类表示通过套接字访问网络的权限。 |
StandardSocketOptions | 定义了标准的套接字选项。 |
URI | 表示统一资源标识符(URI)引用。 |
URL | URL类表示统一资源定位符,即指向“网络上的资源”的指针。 |
URLClassLoader | 此类加载器用于从URL的搜索路径中加载类和资源,这些URL引用JAR文件和目录。 |
URLConnection | URLConnection抽象类是表示应用程序与URL之间的通信链接的所有类的超类。 |
URLDecoder | 用于HTML表单解码的实用类。 |
URLEncoder | 用于HTML表单编码的实用类。 |
四、枚举概述
枚举 | 描述 |
---|---|
Authenticator.RequestorType | 请求身份验证的实体类型。 |
Proxy.Type | 代表代理类型。 |
StandardProtocolFamily | 定义通信协议的标准族。 |
五、异常概述
异常 | 描述 |
---|---|
BindException | 在尝试将套接字绑定到本地地址和端口时发生错误。 |
ConnectException | 在尝试将套接字连接到远程地址和端口时发生错误。 |
HttpRetryException | 表示需要重试HTTP请求,但由于启用了流模式,无法自动重试。 |
MalformedURLException | 表示发生了格式错误的URL。 |
NoRouteToHostException | 在尝试将套接字连接到远程地址和端口时发生错误。 |
PortUnreachableException | 表示已在连接的数据报上收到ICMP Port Unreachable消息。 |
ProtocolException | 指示底层协议存在错误,例如TCP错误。 |
SocketException | 表示创建或访问套接字时出现错误。 |
SocketTimeoutException | 表示套接字读取或接受超时。 |
UnknownHostException | 表示无法确定主机的IP地址。 |
UnknownServiceException | 表示发生了未知的服务异常。 |
URISyntaxException | 表示无法将字符串解析为URI引用。 |