对于socket的编程一直是懵懂的状态,最近正好有心情,也有强烈看一遍java.net包的想法,正好借此机会详细了解一下java.net包

java.net 包中共有8个接口,38个实现类(其中包括抽象类)

 

下面是jdk 1.6(中文版本)对于java.net的描述

软件包 java.net 的描述
为实现网络应用程序提供类。

java.net 包可以大致分为两个部分:

低级 API,用于处理以下抽象:

地址,也就是网络标识符,如 IP 地址。

套接字,也就是基本双向数据通信机制。

接口,用于描述网络接口。

高级 API,用于处理以下抽象:

URI,表示统一资源标识符。

URL,表示统一资源定位符。

连接,表示到 URL 所指向资源的连接。

地址
在整个 java.net API 中,地址或者用作主机标识符或者用作套接字端点标识符。

InetAddress 类是表示 IP(Internet 协议)地址的抽象。它拥有两个子类:

用于 IPv4 地址的 Inet4Address。
用于 IPv6 地址的 Inet6Address。
但是,在大多数情况下,不必直接处理子类,因为 InetAddress 抽象应该覆盖大多数必需的功能。

关于 IPv6
并非所有系统都支持 IPv6 协议,而当 Java 网络连接堆栈尝试检测它并在可用时透明地使用它时,还可以利用系统属性禁用它。在 IPv6 不可用或被显式禁用的情况下,Inet6Address 对大多数网络连接操作都不再是有效参数。虽然可以保证在查找主机名时 java.net.InetAddress.getByName 之类的方法不返回 Inet6Address,但仍然可能通过传递字面值来创建此类对象。在此情况下,大多数方法在使用 Inet6Address 调用时都将抛出异常。

套接字
套接字是在网络上建立机器之间的通信链接的方法。java.net 包提供 4 种套接字:

Socket 是 TCP 客户端 API,通常用于连接远程主机。
ServerSocket 是 TCP 服务器 API,通常接受源于客户端套接字的连接。
DatagramSocket 是 UDP 端点 API,用于发送和接收数据包
MulticastSocket 是 DatagramSocket 的子类,在处理多播组时使用。
使用 TCP 套接字的发送和接收操作需要借助 InputStream 和 OutputStream 来完成,这两者是通过 Socket.getInputStream() 和 Socket.getOutputStream() 方法获取的。

接口
NetworkInterface 类提供 API 以浏览和查询本地机器的所有网络接口(例如,以太网连接或 PPP 端点)。只有通过该类才可以检查是否将所有本地接口都配置为支持 IPv6。

高级 API
java.net 包中的许多类可以提供更加高级的抽象,允许方便地访问网络上的资源。这些类为:

URI 是表示在 RFC 2396 中指定的统一资料标识符的类。顾名思义,它只是一个标识符,不直接提供访问资源的方法。
URL 是表示统一资源定位符的类,它既是 URI 的旧式概念又是访问资源的方法。
URLConnection 是根据 URL 创建的,是用于访问 URL 所指向资源的通信链接。此抽象类将大多数工作委托给底层协议处理程序,如 http 或 ftp。
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 的主要不同点,URI 仅标识资源,所以不必访问协议处理程序。因此,尽管可能利用任何种类的协议方案(例如, myproto://myhost.mydomain/resource/)创建 URI,但类似的 URL 仍将试图实例化指定协议的处理程序;如果指定协议的处理程序不存在,则抛出异常。
默认情况下,协议处理程序从默认位置动态加载。但是,通过设置 java.protocol.handler.pkgs 系统属性也可能增加搜索路径。例如,如果将其设置为 myapp.protocols,则 URL 代码将首先尝试(对于 http 而言)加载 myapp.protocols.http.Handler,然后,如果失败,则尝试从默认位置加载 http.Handler。

注意,处理程序类必须为抽象类 URLStreamHandler 的子类。

 

上面的描述中,总体结构确实很清晰,但是细节还要自己去看,而且很多内容听起来还是很懵懂。

下面来看地址的描述,地址没有抽象出来接口,其中有 个类是用来描述地址,他们的UML关系如下

java netty没有包 java的net包在哪_套接字

大部分的地址描述也不是很清楚,目前主要是使用的还是InetAddress类

  • InetAddress:此类表示互联网协议 (IP) 地址。
  • Inet4Address:此类表示 Internet Protocol version 4 (IPv4) 地址。
  • Inet6Address:此类表示互联网协议第 6 版 (IPv6) 地址。
  • SocketAddress:此类表示不带任何协议附件的 Socket Address。作为一个抽象类,应通过特定的、协议相关的实现为其创建子类。
  • InetSocketAddress:此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名。如果解析失败,则该地址将被视为未解析 地址,但是其在某些情形下仍然可以使用,比如通过代理连接。

它提供不可变对象,供套接字用于绑定、连接或用作返回值。

  • InterfaceAddress:此类表示网络接口地址。简言之,对于 IPv4 地址,是指 IP 地址、子网掩码和广播地址。对于 IPv6 地址,是指 IP 地址和网络前缀长度。

 

套接字(socket) 和socket相关的接口有3个,实现类有6个,UDP的socket还提供了 1 个数据包封装的类,UML关系图如下

java netty没有包 java的net包在哪_.net_02

 

  • SocketImplFactory:(接口)此接口定义用于套接字实现的工厂。Socket 和 ServerSocket 类使用它来创建实际的套接字实现。
  • DatagramSocketImplFactory:(接口)此接口定义用于数据报套接字实现的工厂。DatagramSocket 类使用它来创建实际的套接字实现。
  • SocketOptions:(接口)获取/设置套接字选项的方法的接口。此接口由 SocketImpl 和 DatagramSocketImpl 实现。它们的子类应该重写此接口的方法来支持它们自己的选项
  • SocketImpl:(抽象)抽象类 SocketImpl 是实际实现套接字的所有类的通用超类。创建客户端和服务器套接字都可以使用它。
  • DatagramSocketImpl:数据报和多播套接字实现的抽象基类。
  • Socket:此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
  • ServerSocket:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
  • DatagramSocket:此类表示用来发送和接收数据报包的套接字。
  • DatagramPacket:此类表示数据报包。
  • MulticastSocket:多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。

 

接口(我也不知道这是干嘛的,这里提供了一个类,具体怎么用,什么时候用不清楚)这里只有 1 个类

NetworkInterface:此类表示一个由名称和分配给此接口的 IP 地址列表组成的网络接口。它用于标识加入多播组的本地接口。 接口通常是按名称(如 "le0")区分的


上面就是低级API提供部分,重点就时Tcp连接的Socket/ServerSocket 和 UDP的DatagramSocket(使用DatagramPacket发送内容),创建了3个接口 6+6+1+1 = 14个类。
下面是java.net 包下高级APi提供的内容
UPI(表示一个统一资源标识符 (URI) 引用)
其包目录下就提供一个类 URI类,创建了 1 个类。