
Netty
张Roc
一个害怕认真的人
展开
-
Netty中关于引用计数的retain()/release()方法原子特性的关键compareAndSet
我们知道,实现了ReferenceCounted接口的类的对象都会在引用计数的作用下进行显式的回收。当引用计数为0时,这个对象就不能再被访问了。而这个接口提供了两个方法给我们来操作引用计数。 retain()release()而这个操作是必须保证是在多线程的情况下是安全的,所以他们的操作都是原子的。以retain为例 private ReferenceCounted retain0(int ...原创 2018-04-07 23:22:41 · 3757 阅读 · 0 评论 -
Netty中ByteBuf的回收机制ReferenceCounted
Netty中ByteBuf采用引用计数的方式进行资源的回收,当ByteBuf中的引用计数值为0时,Netty则不允许应用程序采用任何的方式对这个资源进行访问。它通过实现ReferenceCounted维护引用计数。package io.netty.util;/** * A reference-counted object that requires explicit deallocation...原创 2018-04-07 22:47:27 · 996 阅读 · 0 评论 -
关于JDK中的ByteBuffer与Netty中的ByteBuf的对比
JDK中ByteBuffer的缺点只是用一个标志位position来进行读写标记,读写操作要使用flip方法进行切换,不太友好。因为ByteBuffer中的实际存储数据的数组是使用final修饰符修饰的,所以不可以 在原来buffer的基础上动态扩容或者缩小。如果需要扩容,需要另外新建一个ByteBuffer,并将旧的ByteBuffer里面的数组复制到已经扩容的ByteBuffer. final...原创 2018-04-07 22:28:34 · 821 阅读 · 0 评论 -
Netty在注册完之后的bind方法所产生的作用
我们在分析完initAndRegister方法之后,随后就进入了bind端口号的操作了。 abstract void init(Channel channel) throws Exception; private static void doBind0( final ChannelFuture regFuture, final Channel channel...原创 2018-04-05 20:20:58 · 785 阅读 · 0 评论 -
我们在接收一个新的连接请求之后是如何生成一个新的socketchannel并注册读写事件的呢
我们知道,在NioEventLoop当中,我们会循环处理得到的selectedKeys,调用的方法 private void processSelectedKey(SelectionKey k, AbstractNioChannel ch) {其中有代码会去处理Accept事件 // Also check for readOps of 0 to workaround poss...原创 2018-04-05 11:34:55 · 1560 阅读 · 0 评论 -
我们在调用EventLoop.execute()方法时究竟做了一些什么工作
我们在研究注册过程中的源码可以看到这样的一段代码 eventLoop.execute(new Runnable() { @Override public void run() { register0(promi...原创 2018-04-04 17:35:07 · 1929 阅读 · 2 评论 -
Netty中的EventExecutorChooserFactory
我们在研究Netty对channel的注册实现时 ChannelFuture regFuture = config().group().register(channel);其中config()方法返回ServerBootstrapConfig对象,其中带有ServerBootstrap的引用。private final ServerBootstrapConfig config = new Serv...原创 2018-04-04 11:31:25 · 810 阅读 · 0 评论 -
Netty中的ChannelPipeline及其实现
下面是ChannelPipeline的java doc文档的部分介绍/** * A list of {@link ChannelHandler}s which handles or intercepts inbound events and outbound operations of a * {@link Channel}. {@link ChannelPipeline} implemen...原创 2018-04-03 17:40:57 · 651 阅读 · 0 评论 -
Neety中的AttributeKey
我们在讨论Netty的服务器启动程序的bind()方法源码时,看到有这样的一段代码: final Map<AttributeKey<?>, Object> attrs = attrs0(); synchronized (attrs) { for (Entry<AttributeKey<?>, Objec...原创 2018-04-03 16:31:04 · 4525 阅读 · 1 评论 -
Netty中ChannelOption与ConstantPool
我们在讨论Netty的服务器启动程序的bind()方法源码时,看到有这样的一段代码: void init(Channel channel) throws Exception { final Map<ChannelOption<?>, Object> options = options0(); synchronized (options)...原创 2018-04-03 15:23:27 · 599 阅读 · 0 评论 -
Reactor模式论文上半部分
An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events一个对于分离和分发同步事件句柄的对象行为模式1 Intent/意图The Reactor design pattern handles service requests that are delivered co...原创 2018-04-02 14:38:06 · 713 阅读 · 0 评论 -
React模式在Nio中的实现
package com.roc.netty.NettyChat;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.B...原创 2018-03-31 16:01:54 · 1395 阅读 · 0 评论 -
NioServerSocketChannel 、NioSocketChannel使用一个静态的成员变量来存放provider的原因
其实在JavaDoc标明的https://github.com/netty/netty/issues/2308中给出了一个的解释并基于Netty4.0.18版本中给出了解释。Currently SelectorProvider#provider (which contains synchronized block) called for every new channel creation. T...原创 2018-03-30 21:07:19 · 948 阅读 · 0 评论 -
Netty中的ChannelFuture
package io.netty.channel;import io.netty.bootstrap.Bootstrap;import io.netty.util.concurrent.BlockingOperationException;import io.netty.util.concurrent.Future;import io.netty.util.concurrent.Gene...原创 2018-03-30 18:07:39 · 800 阅读 · 0 评论 -
Netty中的Future
package io.netty.util.concurrent;import java.util.concurrent.CancellationException;import java.util.concurrent.TimeUnit;/** * The result of an asynchronous operation. */@SuppressWarnings("Cla...原创 2018-03-30 17:04:05 · 383 阅读 · 0 评论 -
Netty课程中关于Java并发包中的Future
package java.util.concurrent;/** * A <tt>Future</tt> represents the result of an asynchronous * computation. Methods are provided to check if the computation is * complete, to wait f...原创 2018-03-30 16:39:11 · 201 阅读 · 0 评论 -
Netty中ServerBootstrap
ServerBootstrap是Netty中用于构建的服务器的引导类(辅助类),用于对服务器启动之前做一个配置,编程风格采用方法连的方式,优雅美观。 ServerBootstrap bootstrap = new ServerBootstrap(); EventLoopGroup parent = new NioEventLoopGroup(); EventLoopGroup child...原创 2018-03-30 11:47:28 · 409 阅读 · 0 评论 -
Netty的SelectorProvider
package java.nio.channels.spi;import java.io.IOException;import java.net.ProtocolFamily;import java.nio.channels.*;import java.security.AccessController;import java.security.PrivilegedAction;im...原创 2018-03-30 11:10:45 · 841 阅读 · 0 评论 -
Netty中ReflectiveChannelFactory
在Netty中,ReflectiveChannelFactory是用来生产Channel的工厂/** * A {@link ChannelFactory} that instantiates a new {@link Channel} by invoking its default constructor reflectively. * 这个ChannelFactory会利用传入的泛型的默认的...原创 2018-03-30 10:26:50 · 433 阅读 · 0 评论 -
Netty中NioEventLoopGroup类使用的Executor的实现类
我们知道,在NioEventLoopGroup的实例化过程中,会创建一个新的默认执行器ThreadPerTaskExecutor。 protected MultithreadEventExecutorGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, O...原创 2018-03-29 23:17:13 · 544 阅读 · 0 评论 -
操作系统中关于将数据从磁盘发送网络过程中发生的动作
纯粹作为在Netty课程中关于零拷贝的笔记输出,各位看官勿喷!在linux操作系统中,JVM在用户空间下向内核空间发送read命令,并切换至内核态,内核向硬盘灯其他硬件设备读取对应的数据至内核缓冲当中,这里就产生了第一次数据拷贝;数据准备完毕之后,操作系统由内核态转到用户态,并将内核缓冲中的数据拷贝至用户空间的缓冲区当中,这里就产生了第二次数据拷贝;当数据拷贝完成之后,用户空间向内核发送write...原创 2018-03-29 22:47:37 · 888 阅读 · 0 评论 -
Netty中NioEventLoopGroup
NioEventLoopGroup是用于NIO中基于Channel的Selector的实现。{@link MultithreadEventLoopGroup} implementations which is used for NIO {@link Selector} based {@link Channel}s.它本身提供了无参的构造方法 /** * Create a new in...原创 2018-03-29 21:56:59 · 333 阅读 · 0 评论 -
Netty中的EventExecutorGroup
package io.netty.util.concurrent;import java.util.Iterator;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ScheduledExecutorService;import java.util.concur...原创 2018-03-29 18:09:08 · 1876 阅读 · 0 评论 -
Netty中的EventLoopGroup接口
package io.netty.channel;import io.netty.util.concurrent.EventExecutorGroup;/** * Special {@link EventExecutorGroup} which allows registering {@link Channel}s that get * processed for later sele...原创 2018-03-29 17:37:10 · 422 阅读 · 0 评论 -
字符编码的发展历程
转载至知乎的字符编码问答通常我们在编程过程中会碰到如下的字符编码:ASCIIISO-8859GB2312GBKGBK18030UnicodeASCII是最早期的字符集编码,在英语世界国家通用,用一个字节表示,其最高位固定为0,可以表示普通的英文字母,阿拉伯数据,各种像回车、换行等特殊字符,字符集的个数为128个。随着计算机在世界各国的普及,早期的ASCII编码不能再满足各国人民的需求,特别是西欧其...转载 2018-03-28 21:20:35 · 454 阅读 · 0 评论 -
Thrift与gRPC的区别
1:thirf编译器是thrift.exe,gRPC的编译器是基于protoc的gradle或者maven插件2:thrift的消息关键字是struct,gRPC的消息关键字是message3: thrift对service的方法不需要加关键字,但是需要给出参数名 grpc需要加rpc的关键字,而不需要加参数名(但是需要参数类型,外加大括号),而且需要用returns标记返回类型,再加上大括号;...原创 2018-03-28 20:29:32 · 6184 阅读 · 0 评论 -
基于NIO创建的一个简单的聊天室应用
package selector;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio....原创 2018-03-28 13:40:31 · 562 阅读 · 0 评论 -
Nio中Buffer的Scattering Gathering特性
package buffer;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;/**Sc...原创 2018-03-27 13:30:48 · 488 阅读 · 0 评论 -
内存映射Buffer简介
package buffer;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java....原创 2018-03-27 11:22:16 · 446 阅读 · 0 评论 -
Nio中直接缓冲区与间接缓冲区性能测试
package buffer;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;/** * 测试直接缓冲区与堆内缓冲区的性能 * 因为Ni...原创 2018-03-27 10:38:18 · 547 阅读 · 0 评论 -
Nio中的channel与Oio中的stream的区别
channel是双向的,既可以读,也可以写。而stream是单向的,一个stream不可能同时读同时写,这样也从java规范中不允许的,因为inputstream和outputstream都是抽象类,一个类不可能同时继承两个抽象类。应用程序通过channel读取外部数据(比如文件),首先得获取这个数据对应的channel,然后通过channel将数据写入的buffer当中,不管这个buffer是堆...原创 2018-03-27 09:48:24 · 2277 阅读 · 0 评论 -
Nio Buffer中mark方法的作用解析
package com.roc.nio;import java.nio.IntBuffer;import java.security.SecureRandom;/** * 用于对mark属性的测试 * 调用buffer.remak()时,会将当前的position值赋给remak属性, * 保存当前操作的状态,然后get继续执行,当调用buffer.reset()时,会将之前当前的...原创 2018-03-26 22:02:20 · 1658 阅读 · 0 评论 -
对于Nio中只读Buffer的简介
package com.roc.nio;import java.nio.IntBuffer;import java.security.SecureRandom;/** * 测试只读buffer * 如何得到一个只读buffer? * 创建只读buffer的目的是为了阻止其他地方对于这个buffer底层数据的改变, * 只是将只读buffer传给调用者,并不赋予调用者改变的权限,...原创 2018-03-26 21:59:02 · 464 阅读 · 0 评论 -
使用FileChannel实现文件的操作
package com.roc.nio;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;/** * 利用NIO进行文件读取的一般步骤: ...原创 2018-03-26 21:57:24 · 782 阅读 · 0 评论 -
关于龙哥在Netty课程中的FileChannel调用read方法返回0的原因解析
结论:fileChannel在调用read方法时会先对position和limit的值进行检查,如果limit与position的值相等或者position大于limit则直接返回0,不会再调用操作系统的read方法了。我们可以查看FileChannel抽象类的实现类FileChannelImpl中read(ByteBuffer byteBuffer)的源码:/* */ public...原创 2018-03-26 16:44:46 · 2362 阅读 · 1 评论 -
gRPC的重要概念翻译
本篇是对于https://grpc.io/docs/quickstart/java.html文档的翻译。This document introduces some key gRPC concepts with an overview of gRPC’s architecture and RPC life cycle.这边文档从gprc的架构和生命周期介绍了一些关键的grpc的概念It assume...原创 2018-03-24 17:18:39 · 1181 阅读 · 0 评论 -
关于Netty in active中第二章创建的服务端Handler不继承SimpleChannelInboundHandler的原因
书中提到这样的一段话:为什么在服务器中不使用SimpleChannelInboundHandler呢?因为服务器要返回相同的消息给客户端,在服务器执行完成写操作之前不能释放调用读取到的消息,因为写操作是异步的,一旦写操作完成后,Netty中会自动释放消息。而我们在重写SimpleChannelInboundHandler中的read0方法后,为什么会去回收其资源呢?我们可以在代码中看一下其实现:...原创 2018-03-21 13:41:07 · 1018 阅读 · 0 评论