June 26, 2017

Netty中的一些小问题

关于isActive()方法:

isActive()这个方法在整个流程中都会用到,用来判断对应的链路是否激活。定义如下:

/**

* Return {@code true} if the {@link Channel} is active and so connected.

*/

boolean isActive();

Server端:

Server端的实现在NioServerSocketChannel.java中,实现如下:

@Override

public boolean isActive() {

return javaChannel().socket().isBo......

May 30, 2017

Bootstrap源码分析

不管是客户端使用的Bootstrap还是服务端使用的ServerBootstrap都是继承自AbstractBootstrap,AbstractBootstrap的定义如下

public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable {

}

从定义中可见AbstracpBootstrap实现了Cloneable接口,能够进行复制。

Server端:ServeBootstrap

正如前文介绍的......

May 17, 2017

Netty连接超时分析

常用用法为

Bootstrap bootstrap = new Bootstrap();

bootstrap.option(ChannelOption.CONNECT_TIMEOUT,3000);// 设置连接超时时间

ChannelFuture future = bootstrap.connect(server,port);

connect()最终执行的代码为AbstrcatNioChannel.connect()方法,实现如下:

跟踪下去会进入到doConnect()方法中,有

@Override

public final void connect(

final So......

May 15, 2017

close()与shutdownGracefully()

state:writing

Channel.close()与EventExecutorGroup.shutdownGracefully()

Channel.close()

Channel.close()的定义为:

/**

* Request to close this {@link Channel} and notify the {@link ChannelFuture} once the operation completes,

* either because the operation was successful or because of

* an error.

*......

May 10, 2017

Netty数据流分析

前言

稍微对tcp/ip协议有了解的同学都会知道,数据都是以二进制流的形式在网络上进行传播的,而且这些二进制流没有起始和结束标志。我们处理的往往都是Java对象,因此在接收到二进制流数据之后需要对数据进行拆包和反序列化成对象。

这篇文章就是从源代码角度来分析Netty中从接收到数据二进制流到转化为Java对象整个过程。

第一步:接收数据

Netty底层是以Java NIO来实现的,所以Netty中是在Selector中接收数据的,具体的代码在NioEventLoop.processSelectedKey()这个方法中,代码如下:

private static void processSe......