浅谈网络编程

网络编程,主要就是BIO,NIO,AIO编程了,首先要了解各个编程的意思,以及编码复杂度,才能最终去选择,如何使用。

BIO: 同步阻塞式IO,比较直观地就是我们java基础网络编程用的java.net.ServerSocket和java.net.Socket,这种方式是阻塞式的,客户端向服务端发起连接,就会一直等待响应,直到拿到请求数据,或者出现异常,而服务端则监听端口,然后等待客户端连接,这种方式是一对一的,一个服务端线程只能对应一个客户端线程。所以当并发量较大时,就会占用大量的线程资源,最后连接的都会阻塞等待,以至于最后应用无法提供服务。而优化方案则是,服务端在处理客户端连接时,通过线程池的方式,可以很大程度上提高效率。

NIO: 同步非阻塞式IO,又叫new IO,或者non-blocking io(非阻塞式IO)。和ServerSocket和Socket相比,NIO也提供了ServerSocketChannel和SocketChannel。NIO主要包括三大块:Buffer(缓冲区)、Channel(通道)、Selector(多路复用器)。

1)Buffer

   在NIO类库中所有操作都是通过Buffer的,最长用的是ByteBuffer,还有其他的一些基本类型的Buffer,每个Buffer类都有完全一样的操作,只是所处理的数据类型不一样。基本属性有:

capacity:容量,缓冲区最大值,Buffer创建时设置。

limit:缓冲区当前已使用的大小。

position:缓冲区指针位置,也就是缓冲区下一次要都写的位置,每次都会被重新设置。

mark:标记,mark()方法和reset方法都会操作该值,默认是-1。

2)Channel

通道即用来传输读写数据,是双向的,可以读,可以写,也可以同时读写。通道可以分为两大类:用于网络读写的SelectableChannel和用于文件操作的FileChannel,类图如下图


3)selector

多路复用器,Selector会不断轮询注册在其上的Channel,如果某个通道上有新的TCP连接,读或者写事件,Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取Channel集合,进行IO操作。

AIO(NIO2)

    jdk1.7才有的,属于异步非阻塞IO。读和写操作均是异步,应用程序发起读或写操作,然后做自己事情,操作系统完成读写后通知应用程序其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数,它不需要对注册通道进行轮询即可实现异步读写

性能比较:


本文参考netty权威指南

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值