b java.net包源码详解

—> go to 总目录

脑图有描绘java.net的结构。
java.net是java最早的网络编程工具包。主要是C/S结构的BIO模型,效率比较低。
常用的包有nio,以及netty包。

一、Addresses

  • 处理IP协议ipv4/ipv6
  • 处理socket地址(ip+port)
    b java.net包源码详解

名词解释

名称 翻译 描述
unicast 单播 指数据包发送一个目的地址,TCP和UDP都可以
multicast 和多播 多播数据包同时发送到多个目的地址,只有UDP可以

1.1 InetAddressImpl

inetAddressImpl一系列的类需要调用本地方法。这里类是私有的,用户不可见。会被注入到InetAddress类中。
b java.net包源码详解

  • anyLocalAddress是0.0.0.0

1.2 InetAddress类

b java.net包源码详解

  • originalHostName 原始的hostname的保留,对一些domain格式命名的host特别有用,比如 a.dome.s
  • hostname 主机标识
  • int address 地址
  • family 地址簇,ipv4 标识是1,ipv6标识是2

功能

  • 存储ip的元数据信息比如上面的hoder
  • 调用本地方法,获取hostname,ipv4,ipv6地址,回环地址
  • ip的地址是有不同性质的,比如是否是回环地址,网站地址,该地址是否有效。提供一系列is方法来判断。
  • 私有方法提供缓存机制
  • 工具方法提供域名解析,比如输入域名地址和域名返回Ip等

1.3 SocketAddress

ip+port的载体,被用于socket的binding和connecting或者返回值。
b java.net包源码详解

二、SOCKET 套接字

tcp是一个c/s结构,sockets分为Socket和ServerSocket。

2.1 tcp socket

Scoket 类

c/s的client端。
b java.net包源码详解
Field:SocketIml 真正操作socket动作的类,调用本地方法
method

  • bind() 方法,绑定adress类(ip+port)
  • connect() 实质是调用impl的connect方法,真正的发起联接
  • getInputStream()/getOutputStream()方法,获取输入输出流
  • getChannel(),channel是一种新的模型比InputStream更好用。
  • 设置一些套接字状态的方法,核心就是下面的SocketOptions

ServerSocket 类

对adress(ip+port)进行监听,监听实际上是通过监听backlog,accept()方法是一个阻塞性方法,调用时就去查询backlog,有记录就链接

每来一个链接,就会产生一个socket相关的fd。这个backlog其实就是一个数组,记录链接的数量。

  • accept方法对应socket的connect,是服务端进行连接的,发起时是一个阻塞式的等待,就是传统的BIO模型。

2.2 udp socket

DatagramPacket

UDP包的数据格式

DatagramSocket

和TCP不同,UDP并不建立连接。通过bind函数来监听某一个端口,并从这个个端口接受数据(也可以在使用receive是指定其他端口)。

  • bind 指定收发数据的端口
  • conect函数。UDP并不建立连接,但是这里的connect,会丢弃到不是目标address的数据包。

MulticastSocket

多个部署组

2.3 SocketOptions

套接字状态,说明一个套接字的名称和类型。
b java.net包源码详解
底下有一堆实现类,这些实现类会被注入到Socket中。

SocketImpl–TCP类

b java.net包源码详解

  • 一个socketImpl支持socket类和ServerSocket,同时有fd文件,adress目标端口。和本地用来通信的端口

AbstractPlainSocket

抽象类,ScoketImpl的子类,有更具体的业务逻辑实现。而SocketImpl仅仅是定义了方法没有实现。

PlainSocketImpl

协议无关的AbstractPlainSocket子类。调用了大量的native方法。

HttpConnectSocketImpl

基于HTTP协议的socketimpl,就是基于http协议,比如websocket

SocketImpl–UDP类

DatagramSocketImpl

为multicast准备的,就是UDP。
b java.net包源码详解

  • connect并不是链接,而是排斥未知来源的包
  • setTTL 包的失效时间
  • 这也是一个可以包含多个adress的组,同时把包发给多个IP

SocketImpl–socks类

一种网络穿透协议,需要server和client,具体可以在后面专门开篇幅去讲,也会讲到代理的编程

套接字状态StandardScoketOptions

一个工具类定义了socket的几种状态。
标准的套接字状态,ScoketOptions是较早的状态标识,后面统一用StandardScoketOptions

名称 含义
IP_MULTICAST_IF Internet协议(IP)多播数据报的网络接口。
IP_MULTICAST_LOOP Internet协议(IP)多播数据报的回环IP
IP_MULTICAST_TTL Internet协议(IP)多播数据报 的生存时间
IP_TOS Internet协议(IP)标头中的服务类型(ToS)八位字节。
SO_BROADCAST 允许传输广播数据报。
SO_KEEPALIVE 保持连接活着。
SO_LINGER 如果数据存在,则关闭。
SO_RCVBUF 套接字接收缓冲区的大小。
SO_REUSEADDR 重复使用地址。
SO_REUSEPORT 重用端口。
SO_SNDBUF 套接字发送缓冲区的大小。
TCP_NODELAY 禁用Nagle算法。

2.4 NetworkInterface

这个接口也是同样使用本地方法,是本地的网络信息的模型,也是提供了工具去访问。
NetworkInterface
b java.net包源码详解

三、URLConnection

URI包括URL和URN两个类别,URL是URI的子集,所以URL一定是URI,而URI不一定是URL
URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。
URL = Universal Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。
URN = Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。
理解
个人的身份证号就是URN,个人的家庭地址就是URL,URN可以唯一标识一个人,而URL可以告诉邮递员怎么把货送到你手里。

3.1 URI

URI是网络资源的描述格式。形如URI = scheme ":" hire-part ["?" query] [ "#" fragment ]
这个类就是这个协议字段的载体,用来生成和处理这些字段

3.2 URL

URI除了URI还附带协议属性,就是包含描述如何传递的方式
类定义
filed

  • protocl 协议的标识字段
  • address ip+port的地址
  • connection 这个就是与协议对应的链接描述。
    method
  • uri的处理
  • connection的处理

3.3 Connection

与协议相关的实现类。
b java.net包源码详解
对不同协议的解析和处理。
类的成员包含URL的定义,和conection建立连接的定义。
具体的解析行为在实现类上

3.4 httphandle

工具类,被定义用来解析request或者response,不同状态和不同容容块的工具。
这样的好处是,把解析逻辑和目标内容,封装在一起,方便把整个过程拆分成小截。
b java.net包源码详解