socket原生处理沾包Java socket源码分析_构造函数


先来看看他引入了什么包,前两个包是io流的,可以简单的搭建起一个BIO模型,由于之前写的那篇博文略水,所以细说一下:BIO是一个最简单的传输模型,全称为Blocking IO他是同步切阻塞的。就如同学校差一点的食堂菜口,做饭的叔叔阿姨如果没把饭做好,那你只能默默等待,直到“佳肴“”出炉,你才能蹦跳着离开。关于这个包的解析我尽量快点推出。

第四个SOCKETCHANNEL是一个优于前两者的双向通道

欢迎大佬们在评论区中说出后面几个的用途并一起交流交流。

正式开始

socket原生处理沾包Java socket源码分析_构造函数_02


我们看到这个类的开头定义,得知Socket继承于Closeable这个类,并规定了许多属性。本着Java万物基于Object的思想,我决定先看看Closeable 这个类有啥内容

socket原生处理沾包Java socket源码分析_父类_03


显然他是个控制Socket关闭的类,其实还能往下看,但是猜测一下就知道他的父类是干什么了。有兴趣的朋友可以自己看看,他的最底层是个自定义接口。

回到Socket,在他的属性中有一个我从未见过的类

socket原生处理沾包Java socket源码分析_socket原生处理沾包Java_04


我先忽略继续Socket,在其构造函数中定义了调用了一个方法

socket原生处理沾包Java socket源码分析_Java_05


创建了一个未连接的socket还规定了他是一个system-default类型的socketimpl。我们来看看 他其中调用的方法

socket原生处理沾包Java socket源码分析_java_06


这个方法中的factory定义如下

socket原生处理沾包Java socket源码分析_java_07


注释上说这是个工厂,有点抽象。不妨进一步挖掘其源码SocketImplFactory定义如下

socket原生处理沾包Java socket源码分析_构造函数_08


到这里还是出现了SocketImpl。

什么是SocketImpl?这个问题先记到小本本上,在末尾我们在一起探讨。

回到Socket看他其他的构造函数

socket原生处理沾包Java socket源码分析_socket原生处理沾包Java_09


socket原生处理沾包Java socket源码分析_父类_10


这就到了我们最常用的一个构造函数了注释上说他是用于创建并连接,注释上还说该构造函数会在连接前判断host是否为空,若为空则会创建"plain"socket。在后面几个构造函数中都可以发现这个InetSocketAddress,说明这个方法负责Socket的连接,感兴趣可以去看看他的源码。

写到这我已经有些乏力了,主要是英文看起来好累

为了不让内容变水,我决定最后分析一个常用方法的源码

socket原生处理沾包Java socket源码分析_构造函数_11

socket原生处理沾包Java socket源码分析_父类_12


首先他对一系列先决条件做判断,然后锁定当前Socket,那一大串我们可以暂时不管,主要看他的return

socket原生处理沾包Java socket源码分析_socket原生处理沾包Java_13


得出他返回的就是当前的InputStream

最后

这篇博客很好的解决得SocketImpl是什么的问题

码字真的不容易,看原文太耗精力了,希望下次还有机会再这样分析分析