bytebuffer

Netty 的主要组件

喜欢而已 提交于 2020-02-23 22:35:39
ByteBuf 组件 当我们进行数据传输的时候,往往需要使用到缓冲区,常用的缓冲区就是 JDK NIO类库 提供的 Buffer组件,7 种基本数据类型 ( Boolean 除外 ) 都有自己的缓冲区实现。对于 NIO编程 而言,我们主要使用的是 ByteBuffer。从功能角度而言,ByteBuffer 完全可以满足 NIO编程 的需 要,但是由于 NIO编程 的复杂性,ByteBuffer 也有其局限性,它的主要缺点如下。 ByteBuffer 长度固定,一旦分配完成,它的容量不能动态扩展和收缩,当需要编码的 POJO对象 大于 ByteBuffer 的容量时,会发生索引越界异常; ByteBuffer 只有一个标识位置的 指针position,读写的时候需要手工调用 flip() 和 rewind() 等,使用者必须小心谨慎地处理这些 API,否则很容易导致程序处理失败; ByteBuffer 的 API 功能有限,一些高级和实用的特性它不支持,需要使用者自己编程实现。 为了弥补这些不足,Netty 提供了自己的 ByteBuffer实现,即 ByteBuf, 下面我们看一下 ByteBuf 的原理和主要功能。 ByteBuf 工作原理 首先,ByteBuf 依然是个 Byte数组 的缓冲区,它的基本功能应该与 JDK 的 ByteBuffer 一致,提供以下几类基本功能。

java nio中的字符集

我与影子孤独终老i 提交于 2020-02-09 14:23:53
字符集 一 看支持哪些字符集 //获取字符集 Map<String, Charset> mycharset=Charset.availableCharsets(); Set<Map.Entry<String,Charset>> set=mycharset.entrySet(); for(Map.Entry<String,Charset> entry:set){ System.out.println(entry.getKey()+" = "+entry.getValue()); } 二 编解码 //一个中文俩字节,一个英文一字节 ---编码: 字符串--》字节数组 ---解码:字节数组--》字符串 void test3() throws CharacterCodingException { //获取编码器 //编码器.encode(aCharBuffer);会返回一个ByteBuffer Charset charset=Charset.forName("GBK"); CharsetEncoder encoder=charset.newEncoder(); //获取解码器 //解码器.decode(aByteBuffer);会返回一个CharBuffer Charset charset1=Charset.forName("GBK"); CharsetDecoder decoder

netty权威指南学习笔记一——NIO入门(4)AIO

本秂侑毒 提交于 2020-02-07 03:50:16
  NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供以下两种方式获取操作结果。   1、通过java.util.concurrent.Future 类来表示异步操作的结果;   2、在执行异步操作的时候传入一个java.io.channels。   ComplementHandler接口的实现类作为操作完成的回调。   NIO2.0的异步套接字通道是真正的异步非阻塞I/O, 它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写 ,从而简化了NIO编程模型。   改造后的代码 server端代码:    1 package com.example.biodemo; 2 3 4 import java.io.*; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class TimeServer { 9 public static void main(String[] args) throws IOException { 10 int port = 8092; 11 if (args != null && args.length > 0) { 12 try { 13 port = Integer.valueOf(args[0

架构师-Netty(五)

半腔热情 提交于 2020-02-05 18:47:49
Buffer和相关辅助类 ByteBuffer 常用的缓冲区JDK NIO 类库 java.nio.Buffer JDK提供的 ByteBuffer 可以满足NIO编程,但有其局限性: ByteBuffer 长度固定,不能自动扩缩容,编程对象POJO大于 ByteBuffer 的容量时,或发生索引越界异常 ByteBuffer 只有一个标识位置的指针position,读写的时候需要手工调用 flip() 和 rewind() 等,使用者必须必须小心谨慎地处理这些API,否则很容易导致程序处理失败; ByteBuffer 的API功能有限,一些高级和实用的特性不支持,需要使用者自己编程实现 ByteBuf自动扩容 iAbstractByteBuf#writeByte 调用 ensureWritable0 方法 final void ensureWritable0 ( int minWritableBytes ) { ensureAccessible ( ) ; if ( minWritableBytes <= writableBytes ( ) ) { return ; } if ( minWritableBytes > maxCapacity - writerIndex ) { throw new IndexOutOfBoundsException ( String .

NIO管道Pipe

不打扰是莪最后的温柔 提交于 2020-02-05 05:12:34
实现开启一条线程向Pipe 管道里面写入数据,另一条线程读取Pipe管道里面的数据 package com . mock ; import org . junit . jupiter . api . Test ; import java . io . IOException ; import java . nio . ByteBuffer ; import java . nio . channels . Pipe ; import java . time . LocalTime ; public class TestPipe { @Test public void test ( ) throws Exception { final Pipe pipe = Pipe . open ( ) ; //一条线程向管道写数据,另一条线程从管道中读取数据 new Thread ( ( ) - > write ( pipe ) ) . start ( ) ; new Thread ( ( ) - > read ( pipe ) ) . start ( ) ; Thread . sleep ( 6000 ) ; } //写数据到管道 public void write ( Pipe pipe ) { try { ByteBuffer byteBuffer = ByteBuffer .

常见IO模型(BIO、NIO、AIO)

点点圈 提交于 2020-02-05 00:59:00
1.网络模型 a.编程模型 TCP UDP TCP->可靠连接、使命必达、速度慢 UDP->不可靠、速度快 1.常见的IO模型 blocking IO == Old IO(BIO) 案例:如果不开线程,那么就会阻塞。 public class Server { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(); ss.bind(new InetSocketAddress("localhost", 8888)); new Thread(()->{ try { Socket s = ss.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(br.readLine()); br.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } }); ss.close(); } } Non-Blocking IO(NIO)->Java的API还不如C 调用Linux底层的epoll(),使用一个Channel

NIO 概述 与 通信实例

给你一囗甜甜゛ 提交于 2020-02-05 00:25:13
NIO 简述: NIO是在jdk1.4之后加入的一种基于缓冲区(buffer)和通道(channel)的I/O方式, nio是同步非阻塞的i/o模式,同步是指线程不断地轮询i/o事件,非阻塞是在处理i/o事件的同时,还可以去处理其它的事情。 同步的核心是Selector(选择器),代替的线程本身的轮询i/o事件,避免了阻塞同时线程的不必要消耗, 非阻塞的核心就是通道和缓冲区,当有i/o事件就绪时,写入到缓冲区,保证i/o成功。而无需等待。 为什么使用nio? 使用nio是为了java程序员可以实现高速的i/o操作,不用编写自定义的本机代码。nio将最耗时的i/o操作转回到操作系统,因而提交了效率。 NIO 通道 缓冲区: 通道可以被异步读写,通道始终读写缓冲区。 channel ——> buffer buffer ——> channel 数据可以从通道读取到缓冲区,也可以是冲缓冲区读取到通道。 Channel有很多种实现 : FileChannel 从文件中读取数据 DataGramChannel 通过udp连接在网络中读取数据 SocketChannel 能通过socket连接在网络中读取数据 ServerSocketChannel 可以监听新进来的tcp连接 Buffer 的实现: byteBuffer charBuffer longBuffer DoubleBuffer ..

【Netty整理03-NIO】Java 实现 NIO demo

自作多情 提交于 2020-02-04 23:48:17
jdk提供的NIO使用: 概览: https://blog.csdn.net/the_fool_/article/details/83000648 博主抄写了网上的demo,略作修改与调整,原文链接: Demo01:抄写地址忘记了。。。 1、服务端代码: package com.test3; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.util.Iterator; /** * NIO服务端代码 * @author http:// * @author ZX * 监听客户端连接,接收、发送消息 * */ public class AServer { public static void main(String[]args)throws Exception{ System.out.println("================="); //创建选择器 Selector selector = Selector.open(); /

网络编程模型 nio

末鹿安然 提交于 2020-02-04 23:15:32
1.简介 nio 是new io的简称,1.4之后提供。特性:为所有的原始类型提供缓存支持(Buffer),字符集编码解码解决方案,channel一个原始的i/o抽象,支持锁和内存映射文件的文件访问接口,提供多路(non-blcoking)非阻塞式的高伸缩性网络。 2.比较 bio 同步阻塞,jdk1.4之前使用,阻塞到读写方法,阻塞到线程来提高并发性能,效果一般 nio 同步非阻塞io,jdk1.4后,linux多路复用技术,实现io的轮询方式,目前是主流的网络通信模式,netty 框架, aio 异步非阻塞io ,jdk1.7后,基于linux的epoll模式,目前使用较少, 3.基本编程模型 服务端: 核心api ServerSocket 流程 ; 先创建一个服务,然后绑定在服务器的ip地址和端口 等待客户端的链接请求 收到连接请求后,接受请求,建立了一个tcp连接 从建立的连接中获取到socket输入、输出流(同步阻塞) 通过两个流进行数据的交互 客户端: 核心api Socket 流程 : 先向服务端请求连接 一旦被服务器接受,连接就创建好了 从tcp连接中获取socket输入、输出流 通过两个流进行数据的交互 3.原理 阻塞和非阻塞:阻塞和非阻塞是进程在访问数据时,数据是否准备就绪的一种处理方式,当数据没有准备好的时候, 阻塞是往往需要等待缓冲区中的数据准备好之后才处理

Why is copyPixelsFromBuffer giving incorrect color? setPixels is correct but slow

南楼画角 提交于 2020-02-02 11:31:08
问题 For my android app I am getting a ByteBuffer from native code. It contains the pixel color values to create a bitmap. Original image - I used copyPixelsFromBuffer on bitmap, but I am getting incorrect color on displaying the bitmap. Here is the code for this approach - Approach 1 ByteBuffer buffer = ... Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); buffer.rewind(); bitmap.copyPixelsFromBuffer(buffer); Approx. time - ~0.4 ms Result - Wrong colors - Approach 2