最近项目要求Android客户端使用Socket,所以把Android平台能够使用的Socket调研了一下:
Socket介绍
Socket分为如下几种:BIO、NIO、AIO,在了解每种Socket之前,首先要了解几个概念:
Socket相关概念
- 同步: 是指应用进程触发IO操作后,等待或者轮询查看IO状态是否改变。
- 异步: 是指应用进程触发IO操作后,就去执行其它任务,当有内核进程通知应用进程IO状态发生改变,应用进程根据最新的状态进行IO操作。
- 阻塞: 是指当IO状态改变后,进行相关IO操作时,如果IO被占用,一直处于等待,知道IO可用为止。
- 非阻塞: 是指当IO状态改变后,进行相关IO操作时,如果IO被占用,马上返回操作结果值,当IO就绪时,IO函数会通知最新的IO状态,从而继续进行IO操作。
了解以上几个概念之后,通过不同的组合,就会形成Socket的几个种类:BIO、NIO、AIO
- 同步阻塞(BIO): 代码行为模式为一个连接在一个线程中运行,在每个线程中如果IO处于阻塞状态,就是指一直等待IO准备就绪,知道可以继续进行操作。可用线程池提高处理性能。
- 同步非阻塞(NIO): 代码行为模式为一个请求一个线程。每一个连接通道都会注册到多路复用器上,多路复用器会轮询所有连接通道,发现有IO请求时会启动一个线程进行处理。多路复用器需要再一个单独的线程中去执行轮询操作。
- 异步阻塞(NIO): 代码行为模式为当应用发起IO操作后,马上就会受到状态回复,当内核处理完IO操作后,通知应用程序IO最新状态。在OS内核层,系统会调用select系统调用对IO进行处理,select会同时监听多个文件句柄,提高了并发性,但是对于每个文件句柄的读写操作时阻塞的。
- 异步非阻塞(AIO):代码行为模式为应用进程发起一个IO操作后立即返回,等内核处理完IO操作后,会通知应用进程IO数据,应用进程取得数据进行处理即可。
如果理解不太清楚,可以通过下面例子进行辅助理解:
- 同步阻塞: 小明去书店买书,然后一直在柜台前等着,并且一直询问:有书吗?有书吗?……
- 同步非阻塞: 小明去书店买书,跟柜台说完后就去网吧玩了,玩一会就跑回柜台问一下:书准备好了吗?
- 异步阻塞:小明给书店打电话说要定新书,当在网吧玩时,书店打来电话,说有新书了,小明自己去拿书。
- 异步非阻塞:小明给书店打电话说定新书,当在网吧玩时,书店打电话说,有新书到了,并派人将新书送过来。
应用场景
- BIO:适用于方法简单,开发速度快。但是连接数较小,对服务器性能较高,并发性差。
- NIO:适用于连接数多且为短链接,轻数据量的服务器,比如通讯服务器,编程方式复杂,JDK1.4中引入。
- AIO:适用于连接数少且为长连接,重数据量的服务器,比如视频服务器,充满在JDK1.7中引入,所以Android系统中,只用5.0+版