Netty基础篇:一个乱写程序对Get方法的思考

简介: Netty基础篇:一个乱写程序对Get方法的思考


package com.suns.Netty02Copy;
import java.nio.ByteBuffer;
public class Test {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        byteBuffer.put(new byte[]{'a','b','c','d'});
        byteBuffer.clear();
        System.out.println("byteBuffer.limit() = " + byteBuffer.limit());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        byteBuffer.put(new byte[]{'e'});
        byteBuffer.put(new byte[]{'f'});
        byteBuffer.flip();
        System.out.println("byteBuffer.limit() = " + byteBuffer.limit());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + "  byteBuffer.position()=" +byteBuffer.position());
        //byteBuffer.limit() = 10
        //byteBuffer.get() = a  byteBuffer.position()=1
        //byteBuffer.get() = b  byteBuffer.position()=2
        //byteBuffer.get() = c  byteBuffer.position()=3
        //byteBuffer.get() = d  byteBuffer.position()=4
        //byteBuffer.get() =    byteBuffer.position()=5
        //byteBuffer.get() =    byteBuffer.position()=6
        //byteBuffer.get() =    byteBuffer.position()=7
        //byteBuffer.limit() = 9
        //byteBuffer.get() = a  byteBuffer.position()=1
        //byteBuffer.get() = b  byteBuffer.position()=2
        //byteBuffer.get() = c  byteBuffer.position()=3
        //byteBuffer.get() = d  byteBuffer.position()=4
        //byteBuffer.get() =    byteBuffer.position()=5
        //byteBuffer.get() =    byteBuffer.position()=6
        //byteBuffer.get() =    byteBuffer.position()=7
        //byteBuffer.get() = e  byteBuffer.position()=8
        //byteBuffer.get() = f  byteBuffer.position()=9
        //Exception in thread "main" java.nio.BufferUnderflowException
        //  at java.nio.Buffer.nextGetIndex(Buffer.java:500)
        //  at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:135)
        //  at com.suns.Netty02Copy.Test.main(Test.java:39)
        //
        //Process finished with exit code 1
    }
}

1:执行完Clear方法之后,对应的模式是写模式,写模式我们依旧可以去执行get方法,所谓的写模式仅仅是capacity和position和limit的三个指标的模型而已。

2:get方法不受Buffer读写模式的影响,执行一个get方法就一定会让position向右挪移一位,当我们的position已经和我们limit是一致的时候,就会抛出来一个 java.nio.BufferUnderflowException异常。

3:也就是说,我们的position不能超过limit。这一点我们使用下面的代码来演示证明。

package com.suns.Netty02Copy;
import java.nio.ByteBuffer;
public class Test {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        byteBuffer.put(new byte[]{'a','b','c','d'});
        //这里是写模式,我们接下来转换为读模式。
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("-------------------------------------------------");
        System.out.println(byteBuffer.position() + "-----------" + byteBuffer.limit());
        //这里limit是跟capacity相等了,说明position和limit和capacity的关系永远只能是:position < limit < capacity
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
        System.out.println("byteBuffer.get() = " + byteBuffer.get());
    }
}
//byteBuffer.get() = 0
//byteBuffer.get() = 0
//byteBuffer.get() = 0
//byteBuffer.get() = 0
//byteBuffer.get() = 0
//byteBuffer.get() = 0
//-------------------------------------------------
//1010
//Exception in thread "main" java.nio.BufferUnderflowException
//  at java.nio.Buffer.nextGetIndex(Buffer.java:500)
//  at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:135)
//  at com.suns.Netty02Copy.Test.main(Test.java:19)
//
//Process finished with exit code 1

当然以上的情况,我们的limit和capacity相等了,所以这个说服力不是很强

package com.suns.Netty02Copy;
import com.sun.media.sound.SoftTuning;
import java.nio.ByteBuffer;
public class Test {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        byteBuffer.put(new byte[]{'a','b','c','d'});
        //这里是写模式,我们接下来转换为读模式。
        byteBuffer.flip();
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get());
        System.out.println("byteBuffer.get() = " + (char)byteBuffer.get());
    }
    //byteBuffer.get() = a
    //byteBuffer.get() = b
    //byteBuffer.get() = c
    //byteBuffer.get() = d
    //Exception in thread "main" java.nio.BufferUnderflowException
    //  at java.nio.Buffer.nextGetIndex(Buffer.java:500)
    //  at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:135)
    //  at com.suns.Netty02Copy.Test.main(Test.java:18)
}

这里可以说明:get一次position向右移动一次,如果position > limit 就会报错:BufferUnderflowException

相关文章
|
2月前
|
缓存 网络协议 算法
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析
134 0
|
3月前
|
Java Maven
Netty | 属于你的第一款Netty应用程序 🚀
Netty | 属于你的第一款Netty应用程序 🚀
40 0
|
9月前
|
网络协议 前端开发 Java
Netty实战(二)第一个Netty程序
这只是一个简单的应用程序,但是**它可以伸缩到支持数千个并发连接**——每秒可以比普通的基于套接字的 Java 应用程序处理多得多的消息。
114 0
|
4月前
|
缓存 网络协议 算法
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(二)
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析
59 1
|
4月前
|
设计模式 网络协议 算法
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
84 1
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
|
4月前
|
NoSQL Java Redis
跟着源码学IM(十二):基于Netty打造一款高性能的IM即时通讯程序
关于Netty网络框架的内容,前面已经讲了两个章节,但总归来说难以真正掌握,毕竟只是对其中一个个组件进行讲解,很难让诸位将其串起来形成一条线,所以本章中则会结合实战案例,对Netty进行更深层次的学习与掌握,实战案例也并不难,一个非常朴素的IM聊天程序。 原本打算做个多人斗地主练习程序,但那需要织入过多的业务逻辑,因此一方面会带来不必要的理解难度,让案例更为复杂化,另一方面代码量也会偏多,所以最终依旧选择实现基本的IM聊天程序,既简单,又能加深对Netty的理解。
85 1
|
10月前
|
网络协议
netty编程实战02-创建一个带有连接重试的tcp客户端程序
netty编程实战02-创建一个带有连接重试的tcp客户端程序
162 0
|
8月前
|
移动开发 小程序 Java
良心分享:基于Java+SpringBoot+Netty+WebSocket+Uniapp轻松搭建在线互动问答程序
本文将详细介绍如何基于你自己的开源项目搭建一个在线互动问答程序,包括微信小程序和H5网页版。 该项目服务端主要使用了Java + Spring Boot + Netty + WebSocket等技术栈,聊天客户端使用的是UniApp来轻松搭建微信小程序和H5网页端。
38 1
|
9月前
|
网络协议 数据安全/隐私保护 网络架构
Netty实战(十五)UDP广播事件(一)UDP简介和示例程序
用户数据报协议(UDP)上,它通常用在性能至关重要并且能够容忍一定的数据包丢失的情况下使用
169 0
|
10月前
|
网络协议 Java
netty编程实战01-创建一个tcp服务端程序
netty编程实战01-创建一个tcp服务端程序
201 0