java进阶干货Java学习笔记程序猿阵线联盟-汇总各类技术干货

网络编程之SocketIO基础

2017-11-04  本文已影响316人  landy8530

继上一篇文章《网络编程之IO与NIO阻塞分析》的讲解,已经知道了网络编程的基本方式,今天将继续进行网络编程相关概念的深入讲解。

1.基本概念

1.1 IO(BIO)

Blocking IO,同步阻塞式IO(传统的网络编程模型),完全依靠网络,具有以下特点:

1.2 NIO

Non-Blocking IO 同步非阻塞,多了一个管道的概念,以空间换时间的概念。

1.2 AIO

NIO2.0,异步+非阻塞 (JDK1.7以后实现)

1.3 Socket

套接字,应用程序间的TCP通信通常通过Socket向网络发出请求或者应答网络请求

2.阻塞和非阻塞

程序在等待调用结果(消息,返回值等)时的状态(具体的技术,接收数据的方式、状态),针对网络传输而言。

可参见上一篇文章《网络编程之IO与NIO阻塞分析》的详细讲解。

3.同步和异步

关注的是消息通信机制(synchronous communication/asynchronous communication),一般是面向操作系统与应用程序对IO操作的层面上来区分(server端应用程序的执行方式),针对程序层面而言。

典型的异步编程模型Node.js

4.Socket的连接过程

Socket的连接过程分为四个步骤:服务器监听、客户端请求服务器、服务器确认、进行通信。

5.NIO详解

一般称作Non-Blocking IO,同步非阻塞,在传统的TCP直接建立连接的基础,做了一层抽象,把客户端(SocketChannel)和服务端(ServerSocketChannel )注册到多路复用器上,然后Selector回去轮询所有注册到服务器上的SocketChannel的通道,根据通道的状态(connect/连接、Accept/阻塞、Read/可读、Write/可写)执行相关操作。(概念好理解,编程不好实现)。
这边涉及几个核心概念:Buffer(缓冲区,填充数据的结构)、Channel(管道)、Selector(选择器,多路复用器),如下图所示:

NIO核心概念.png

5.1 Buffer

Buffer是一个包含一些要写入或者读取的数据的对象,在NIO类库中加入Buffer对象,体检了新库与原IO的一个重要的区别:

5.2 Channel

网络数据通过Channel进行读写操作,通道与流不同之处在于,通道是双向的(可以用于读写或者二者同时进行,最关键的可以与Selector结合起来),而流是单方向的(一个流必须是InputStream或者OutputStream的子类)。通道分为两大类

5.3 Selector

NIO编程的基础,核心。提供了已经选择就绪的任务的能力,Selector会不断的轮询注册到其上的Channel,如果某个通道发生了读写操作,这个通道就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以取得就绪的Channel的集合(可能有多个channel),从而进行后续的IO操作

NIO编程需要注意的问题:TCP拆包粘包的问题(解码的时候才会出现这个问题)

6.AIO(NIO2.0)

异步非阻塞,在NIO的基础上,引入了异步通道的概念,并提供了异步文件和异步套接字通道的实现,从而在真正意义上实现了异步非阻塞。AIO不需要通过Selector注册Channel进行轮询操作即可实现异步读写,从而简化了NIO编程模型。(概念不好理解,编程好实现

7.IO多路复用的系统调用使用epoll代替了select,主要有以下几方面原因(整理自《netty权威指南》):

上一篇 下一篇

猜你喜欢

热点阅读