(一)what?什么是网络编程?
①:概念:本质上是两个设备之间的数据交换。
②:主要对象:TCP层提供面向应用的可靠的(TCP连接,字节流)或者非可靠的(UDP无连接,报文)的数据传输机制。
(二)why?为什么要使用网络编程?
(三)how?怎么使用网络编程?
(1).Java 网络IO编程:
①:分类:
1.BIO【同步阻塞--- 一请求一应答】eg:图解
【优点:简单
缺点:性能和可靠性都不好】
①:BIO是什么?what?
概念: 通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理没处理完成后,通过输出流返回应答给客户端,线程销毁。即典型的一请求一应答通宵模型。
②:为什么?why?
优点: 一 一对应,
缺点:无法高性能,高并发的接入场景。(原因:服务端----一个线程只能为一个客户端连接)
③:怎么用?how?
详细细节看:Java IO网络编程总结文章。【http://www.cnblogs.com/not-alone/articles/8352000.html】
1.1(伪异步IO)eg:图解
优点:有效的控制了线程的最大数量,保证了系统有限的资源的控制,实现了N:M的伪异步I/O模型。
缺点:读取数据较慢时(比如数据量大、网络传输慢等),大量并发的情况下,其他接入的消息,只能一直等待
【只需要将新建线程的地方,交给线程池管理即可,只需改动刚才的Server代码】
怎么用:Java IO网络编程总结文章。
2.NIO【同步非阻塞】(所有数据都是用缓冲区处理)
①:是什么?what?
1.1 Nonblock I/O 无阻塞 I/O。
1.2用了哪些工具类东西?
①:缓冲区 Buffer【是对象,写入或者读取数据】(分类:ByteBuffer,CharBuffer、ShortBuffer、IntBuffer、LongBuffer、DoubleBuffer。他们实现了相同的接口:Buffer)
②:通道 Channel 【通道是双向的,可用于读和写同时操作】(分类:SelectableChannel用户网络读写;FileChannel用于文件操作)
【后面涉及的ServerSocket和SocketChannel都是SelectableChannel的子类】
③:多路复用器Selector:
②:为什么?why?使用场景:【高负载,高并发的(网络)应用,like 企鹅帝国】
③:怎么做?how?
1.1 Service服务端
步骤:①打开ServerSocketChannel,监听客户端连接②绑定监听端口,设置连接为非阻塞③创建Reactor线程,创建多路复用器,并启动线程④将ServerSocketChannel注册到Reactor线程中的Selector上,监听ACCEPT事件⑤Selector轮询准备就绪的Key⑥Selector监听到新的客户端接入,处理新的接入请求,完成TCP三次握手,建立物理链路⑦设置客户端链路为非阻塞⑧将新接入的客户端连接注册到Reactor线程的Selector上,监听读操作,读取客户端发送的网络消息⑨异步读取客户端消息到缓存区⑩对Buffer编解码,边处理半包消息,将解码成功的消息封装成Task ⒒将应答消息编码为Buffer,调用SocketChannel的write将消息异步发送给客户端
Client客户端:与服务端很相似,详细代码看 http://www.cnblogs.com/not-alone/articles/8352000.html
3.AIO【异步非阻塞】
①:是什么?what?
1.概念:在NIO基础上提供了异步文件通道和异步套接字通道的实现。
②:为什么?why?
优点:不需要过多的Selector对注册的通道进行轮询即可实现异步读写,简化NIO的编程模型。
③:怎么做?how?代码详解看 http://www.cnblogs.com/not-alone/articles/8352000.html
(2) 各种I/O 的对比 :