Socket不是Java中独有的概念,而是一个语言无关标准。任何能够实现网络编程的编程语言都有Socket。java
网络上的两个程序经过一个双向的通讯链接实现数据的交换,这个链接的一端称为一个socket。程序员
创建网络通讯链接至少要一个端口号。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员作网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通讯的能力。编程
Socket的英文原义是“孔”或“插座”。做为BSD UNIX的进程通讯机制,取后一种意思。一般也称做"套接字",用于描述IP地址和端口,是一个通讯链的句柄,能够用来实现不一样虚拟机或不一样计算机之间的通讯。在Internet上的主机通常运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不一样的端口对应于不一样的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各类插座的房间,每一个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不一样编号的插座,就能够获得不一样的服务。服务器
根据链接启动的方式以及本地套接字要链接的目标,套接字之间的链接过程能够分为三个步骤:服务器监听,客户端请求,链接确认。【若是包含数据交互+断开链接,那么一共是五个步骤】网络
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待链接的状态,实时监控网络状态。异步
(2)客户端请求:是指由客户端的套接字提出链接请求,要链接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要链接的服务器的套接字,指出服务器端套接字的地址和端口号,而后就向服务器端套接字提出链接请求。socket
(3)链接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的链接请求,它就响应客户端套接字的请求,创建一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,链接就创建好了。而服务器端套接字继续处于监听状态,继续接收其余客户端套接字的链接请求。编程语言
在java.net 包是网络编程的基础类库。其中ServerSocket 和Socket 是网络编程的基础类型。ServerSocket 是服务端应用类型。Socket 是创建链接的类型。当链接创建成功后,服务器和客户端都会有一个Socket 对象示例,能够经过这个Socket 对象示例,完成会话的全部操做。函数
对于一个完整的网络链接来讲,Socket 是平等的,没有服务器客户端分级状况。spa
阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操做的就绪状态来采起的不一样方式,说白了是一种读取或者写入操做方法的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入方法会当即返回一个状态值。
以银行取款为例:
阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回);
非阻塞 : 柜台取款,取个号,而后坐在椅子上作其它事,等号广播会通知你办理,没到号你就不能去,你能够不断问大堂经理排到了没有,大堂经理若是说还没到你就不能去(使用非阻塞IO时,若是不能读写Java调用会立刻返回,当IO事件分发器通知可读写时再继续进行读写,不断循环直到读写完成)
同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO 操做并等待或者轮询的去查看IO 操做是否就绪,而异步是指用户进程触发IO 操做之后便开始作本身的事情,而当IO 操做已经完成的时候会获得IO 完成的通知。
以银行取款为例:
同步 : 本身亲自出马持银行卡到银行取钱(使用同步IO 时,Java 本身处理IO 读写);
异步 : 委托一小弟拿银行卡到银行取钱,而后给你(使用异步IO 时,Java 将IO 读写委托给OS 处理,须要将数据缓冲区地址和大小传给OS(银行卡和密码),OS 须要支持异步IO操做API)。
在研究同步异步阻塞非阻塞时,总感受阻塞/非阻塞和同步/异步有殊途同归的地方,其实,这二者存在本质的区别,面向的对象是不一样的。
阻塞/非阻塞:进程/线程须要操做的数据若是还没有就绪,是否妨碍了当前进程/线程的后续操做。
同步/异步:数据若是还没有就绪,是否须要等待数据结果。