1.2.1 Java NIO网络编程

2.1.1 TCP/UDP协议

1、TCP:传输控制协议
        是Internet一个重要的传输层协议
        tcp提供面向连接、可靠、有序、字节流传输服务
        应用程序在使用TCP之前,必须先建立TCP连接

    TCP和UDP比较
            TCP:面向连接、可靠、慢、资源占用多、字节流有序传输
            UDP:无连接、不可靠、快、资源占用少、数据报尽力传输
开发人员用UDP关注4个点
    1、应用进程更容易控制发送什么数据、何时发送
    2、无需建立连接
    3、无连接状态
    4、首部开销小
2、什么情况下用UDP
    视频、音频聊天
    共享单车定位
3、socket编程调用过程
    创建套接字、端点绑定、发送数据、接收数据、释放套接字

4、OSI网络七层模型

5、Tcp协议的数据报文

6、TCP握手机制

2.1.2 BIO阻塞式网络编程

1、BIO:阻塞IO(blocking IO),处理网络I/O时,一个线程只能处理一个网络连接(serverSocket.accept、Socket)

阻塞和非阻塞获取资源的方式,同步/异步是程序如何处理资源的逻辑设计
2、Http协议-请求数据包
       第一部分:请求行(请求类型    /资源路径               HTTP版本)
                                           GET    /localhost/index    HTTP/1.1
       第二部分:请求头(用来说明服务器要使用的附加信息【第一行之后到空行之前的所有内容】)
       第三部分:空行(请求头部与数据主体之间必须有换行)
       第四部分:请求数据(主体【可以是任意数据,也可以为空】)
3、Http协议-响应数据包
       第一部分:状态行(HTTP版本            状态码            状态消息)
                                     HTTP/1.1              200                 OK
       第二部分:响应报头部(用来说明服务器要使用的附加信息【第一行之后到空行之前的所有内容】)
       第三部分:空行(头部与数据主体之间必须有换行)
       第四部分:响应正文(可以是任意数据,也可以为空)

Http协议-请求数据包解析

Http协议-响应数据包解析

4、HTTP协议-响应状态码

2.1.3 NIO非阻塞网络编程三大核心理念

1、NIO叫非阻塞IO(non-blocking IO)
2、NIO三大核心组件
    Buffer缓存区(类似数组):
        写读4个步骤
                将数据写入缓冲区
                调用buffer.flip(),将缓冲区转换为读取模式
                缓冲区读取数据
                调用buffer.clear()或buffer.compact()清除缓冲区
            【clear清除整个缓冲区,compact仅清除已阅读的数据
        Buffer三个重要属性
            capacity(容量)、position(位置)、limit(限制,写入时等于容量,读取时等于数据长度)
    Channel通道:非阻塞的(SocketChannel[与BIO的Socket类似]、ServerSocketChannel
    Selector选择器事件驱动机制(单线程可以管理多个通道,从而管理多个网络连接)

          SelectionKey的4个事件:
                     OP_CONNECT:连接
                     OP_ACCEPT:准备就绪
                     OP_READ:读取
                     OP_WRITE:写入

3、ByteBuffer的两种实现(都用了数组):
    直接内存(direct堆外):堆外内存不受GC控制
                获取方式:ByteBuffer.allocateDirect(int)

           直接内存的垃圾回收:DirectByteBuffer是收GC管理的,GC回收DirectByteBuffer对象时会触发DirectByteBuffer中的Deallocator去调用Cleaner.clean()方法,从而达到回收直接内存【DirectByteBuffer有一个Cleaner对象】
    非直接内存(heap):由于GC会移动对象内存,所以在写file或socket的过程中,JVM会先把数据复制到堆外,再进行写入
                                       所以直接内存比堆内存性能更好一些
                获取方式:ByteBuffer.allocate(int)            
直接内存使用场景:大数据处理
    设置虚拟机参数MaxDirectMemorySize限制大小,防止耗尽整个机器的内存

4、Channel通道

通道可以创建网络连接,还可以传输数据

Channel的API涵盖了UDP/TCP网络和文件IO:
    FileChannel
    DatagramChannel
    SocketChannel
    ServerSocketChannel

5、NIO与BIO对比

利用通道进行读取、写入时,需要在循环中调用,因为它是非阻塞的

操作系统中,所有的Socket操作默认都是阻塞的,如果需要非阻塞的,需要手动设置

serverSocketChannel.configureBlocking(false); // 设置为非阻塞模式
Thread.yield();//暂停当前正在执行的线程对象,并执行其他线程

6、NIO与多线程结合的改进方案

E:\meWork\study\java高级\专题一\Scalable-IO-in-Java.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值