1.1. Socket学习记录

简介

网络上的两个程序通过一个双向的通信连接实现数据的交换

发展历程

在JDK1.5之前,使用的都是netty编程都是基于BIO的,使用方式非常的简单,但是在性能上不是很好,在实际的使用过程中,一般都是使用伪异步的方式去编码。
在JDK1.5时,出现了NIO,NIO很好的解决了BIO的线程链接数过多时,造成的系统崩溃或者无法链接问题。现在应用比较广的netty就是基于NIO实现的,但是,这个时候的Socket还是同步线程去处理的。
在JDK1.7时,出现了AIO,AIO实现了异步非阻塞的通讯。

使用场景

netty框架,底层使用Socket的NIO进行封装。fastDFS,dubbo,rocketMQ底层都是使用netty进行通讯的。

BIO(block IO)

简介

翻译成中文是同步阻塞的IO,也就是在通讯过程中,服务端会阻塞线程一直到与客户端建立连接,与客户端建立连接后,服务端需要新起一个线程进行读写操作。

优缺点

使用简单,如果使用BIO进行编码,需要编写的代码不多。
但是,在线程多的时候,会给服务端造成很大的压力,并别建立的连接非常多,对于网络的压力很大。

NIO(not-block IO/new IO)

简介

翻译成中文是同步非阻塞的IO,在NIO中引入了通道、缓冲、选择器的概念,其中,选择器(selector)是NIO的核心。

执行流程

服务端先起一个选择器(selector),服务端与客户端都是注册连接器上的,服务端会有一个线程一直在轮询选择器中的通道状态(连接状态/阻塞状态/可读状态/可写状态),通过轮询到的状态执行相应的操作。

AIO(Asynchronous IO)

简介

翻译成中文是异步非阻塞的IO,AIO的API其实是对NIO的API进行了进一步封装,并且引入了异步的概念,通过异步的操作,将socket通讯与主线程隔离开(通过类似递归调用的方式生成一个异步阻塞线程)。

执行流程

在创建异步服务通道的时候,需要维护一个建立缓存池和线程组,这个线程组就是用来处理客户端的请求,建立连接,通过服务端实现的服务端处理类处理通讯的操作。(在AIO中也使用了选择器,但是,选择器的使用不需要我们自己编写代码实现,AIO的API已经帮我们实现了)

特点

AIO的阻塞方法,并不会阻塞线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值