6.网络编程

网络编程
    Blocking IO:阻塞式IO
    
    Socket又称套接字,应用程序一般通过“套接字”向网络发出请求或者应答网络请求。
        ServerSocket用于服务器端,Socket是建立网络连接时使用的。连接成功时,应用程序两端会
        产生一个Socket实例。套接字是平等的,不因为在服务器端或者在客户端而产生不同的级别。
        
    套接字之间的连接过程可以分为四个步骤:服务器监听,客户端请求
                                          服务器端连接确认,客户端确认
                                          
    网络编程的基本模型是Client、Server模型,也就是两个进程直接进行相互通信,其中服务端提供
    配置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,
    通过三次握手建立连接,如果连接成功,则双方既可以进行通信。
    
    伪异步
        采用线程池和任务队列可以实现一种伪异步的IO通信框架
        其实就是将客户端的socket封装成一个task任务(实现Runnable接口的类)然后投递到线程池中去,
    
    JDK 1.7 之后实现异步非阻塞,之前只是实现了非阻塞
    
    IO(BIO)和NIO区别:本质就是阻塞和非阻塞区别
        阻塞:应用程序在获取网络数据时,如果网络传输数据慢,那么程序就一直等待,直到传输完
        非阻塞:应用程序直接可以获取已经准备就绪好的数据,无需等待
        
    BIO为同步阻塞  NIO同步非阻塞   (AIO)NIO 2.0 异步非阻塞
    
    同步和异步:一般是面向操作系统与应用程序对IO操作的层面上来区别的
    
        同步时,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一方法上,直到
            数据准备就绪。采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据
        
        异步时,所有的IO读写交给操作系统,应用程序没有直接关系,当操作系统完成了IO读写操作时,
            会给应用程序发送通知,应用程序直接拿走数据即可。
    
    同步说的是server服务器端的执行方式
    阻塞说的是具体的技术,接收数据的方式、状态
    
    ByteBuffer缓冲区    Channel管道、通道    Selector选择器、多路复用器
    
    ByteBuffer是一个对象,它包含一些写入或者要读取的数据,在NIO类库中加入Buffer对象,体现了新库
           与原IO的一个重要区别,在面向流IO中,可以将数据直接写入或读取到Stream对象中。在NIO
           库中,所有数据都是用缓冲区处理的(读写)。缓冲区实质上是一个数组。
    
    ByteBuffer类型:常用的就是ByteBuffer,每一种java基本类型都对应一种缓冲区(除了Boolean类型)
        ByteBuffer  CharBuffer  ShortBuffer  IntBuffer LongBuffer FloatBuffer DoubleBuffer
    
    NIO通信步骤
        1:创建ServerSocketChannel,配置为非阻塞模式
        2:绑定监听,配置TCP参数,录入backlog大小等,
        3:创建一个独立的IO线程,用于轮询多路复用器Selector
        4:创建Selector,将之前创建的ServerSocketChannel注册到Selector上,并设置监听标识位SelectionKey.ACCEPT
        5:启动IO线程,在循环体中执行Selector.select()方法,轮询就绪的通道
        6:当轮询到就绪通道时,需要进行判断操作位,如果是ACCEPT状态,说明是新的客户端接入,则
           调用accept方法接受新的客户端
        7:设置新接入客户端的一些参数,如非阻塞、并将其通道继续注册到Selector中,设置监听标识位
        8:如果轮询的通道操作位是READ,则进行读取,构造Buffer对象等
        9:更细节的还有数据没发送完成继续发送的问题。。。
    
    AIO编程,在NIO的基础上引入了异步,并提供了异步文件和异步套接字通道的实现,从而在真正意义上
        实现了异步非阻塞,AIO他不需要多路复用器对注册的通道进行轮询操作即可实现异步读写
        AsynchronousServerSocketChannel  //服务器通道
        AsychronousScoketChanelGroup     //线程组
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值