BlockingIO java.net
服务端:ServerSocket监听端口,接收连接,返回Socket
客户端:Socket
作为阻塞IO,ServerSocket等待客户端Socket连接过程,也就是accept方法会阻塞线程,在返回连接的客户端Socket之前,该连接线程是无法进行其他活动的。如果不清楚会有多少客户端连接,需要单独一个线程来接收客户端Socket的连接。Socket的read和write都是阻塞的,等待读和等待写的过程的都是阻塞的,在等待读的时候突然需要发送数据,只能再开启一个线程写数据。对于服务端,可能需要保持多个连接,在和一个Socket交互过程中,必然不能实时处理其他Socket的交互。在阻塞IO的模式下,要想给多个实时接收和发送多个Socket数据,只能给每个Socket的读写开启线程。
NonblockingIo java.nio.channels
服务端:ServerSocketChannel
客户端:SocketChannel
作为非阻塞IO,Select方法可以监视注册到Selector上的SocketChannel的状态,当Selector监听的任何一路socket有读写状态时,可以轮询,找到需要处理的Socket进行处理。这样一个线程监听所有的socket,在开启一个线程处理读写,这样也能同时实时的处理大量的Socket。