netty 使用说明
相关jar包
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.77.Final</version>
</dependency>
启动器类
AbstractBootstrap
public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable {
private static final Entry<ChannelOption<?>, Object>[] EMPTY_OPTION_ARRAY = new Entry[0];
private static final Entry<AttributeKey<?>, Object>[] EMPTY_ATTRIBUTE_ARRAY = new Entry[0];
volatile EventLoopGroup group;
private volatile ChannelFactory<? extends C> channelFactory;
private volatile SocketAddress localAddress;
private final Map<ChannelOption<?>, Object> options = new LinkedHashMap();
private final Map<AttributeKey<?>, Object> attrs = new ConcurrentHashMap();
private volatile ChannelHandler handler;
AbstractBootstrap() {
AbstractBootstrap(AbstractBootstrap<B, C> bootstrap) {
public B group(EventLoopGroup group) {
public B channel(Class<? extends C> channelClass) {
public B channelFactory(io.netty.channel.ChannelFactory<? extends C> channelFactory) {
public B handler(ChannelHandler handler) {
public <T> B option(ChannelOption<T> option, T value) {
public <T> B attr(AttributeKey<T> key, T value) {
public B localAddress(SocketAddress localAddress) {
public B localAddress(int inetPort) {
public B localAddress(String inetHost, int inetPort) {
public B localAddress(InetAddress inetHost, int inetPort) {
public ChannelFuture bind() {
public ChannelFuture bind(int inetPort) {
public ChannelFuture bind(String inetHost, int inetPort) {
public ChannelFuture bind(InetAddress inetHost, int inetPort) {
public ChannelFuture bind(SocketAddress localAddress) {
public B validate() {
public ChannelFuture register() {
public abstract B clone();
public abstract AbstractBootstrapConfig<B, C> config();
abstract void init(Channel var1) throws Exception;
final ChannelHandler handler() {
final SocketAddress localAddress() {
final ChannelFuture initAndRegister() {
final Map<AttributeKey<?>, Object> attrs() {
final Map<ChannelOption<?>, Object> options() {
final ChannelFactory<? extends C> channelFactory() {
final Map<AttributeKey<?>, Object> attrs0() {
final Map<ChannelOption<?>, Object> options0() {
final Entry<ChannelOption<?>, Object>[] newOptionsArray() {
final Entry<AttributeKey<?>, Object>[] newAttributesArray() {
static Entry<ChannelOption<?>, Object>[] newOptionsArray(Map<ChannelOption<?>, Object> options) {
static Entry<AttributeKey<?>, Object>[] newAttributesArray(Map<AttributeKey<?>, Object> attributes) {
static <K, V> Map<K, V> copiedMap(Map<K, V> map) {
static void setAttributes(Channel channel, Entry<AttributeKey<?>, Object>[] attrs) {
static void setChannelOptions(Channel channel, Entry<ChannelOption<?>, Object>[] options, InternalLogger logger) {
private B self() {
private ChannelFuture doBind(final SocketAddress localAddress) {
private static void setChannelOption(Channel channel, ChannelOption<?> option, Object value, InternalLogger logger) {
private static void doBind0(final ChannelFuture regFuture, final Channel channel, final SocketAddress localAddress, final ChannelPromise promise) {
public String toString() {
********
内部类:PendingRegistrationPromise
static final class PendingRegistrationPromise extends DefaultChannelPromise {
private volatile boolean registered;
PendingRegistrationPromise(Channel channel) {
super(channel);
}
void registered() {
protected EventExecutor executor() {
Bootstrap:客户端启动器
public class Bootstrap extends AbstractBootstrap<Bootstrap, Channel> {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(Bootstrap.class);
private static final AddressResolverGroup<?> DEFAULT_RESOLVER;
private final BootstrapConfig config = new BootstrapConfig(this);
private volatile AddressResolverGroup<SocketAddress> resolver;
private volatile SocketAddress remoteAddress;
public Bootstrap() {
private Bootstrap(Bootstrap bootstrap) {
public Bootstrap validate() {
public Bootstrap clone() {
public Bootstrap clone(EventLoopGroup group) {
public Bootstrap resolver(AddressResolverGroup<?> resolver) {
public Bootstrap remoteAddress(SocketAddress remoteAddress) {
public Bootstrap remoteAddress(String inetHost, int inetPort) {
public Bootstrap remoteAddress(InetAddress inetHost, int inetPort) {
public ChannelFuture connect() {
public ChannelFuture connect(String inetHost, int inetPort) {
public ChannelFuture connect(InetAddress inetHost, int inetPort) {
public ChannelFuture connect(SocketAddress remoteAddress) {
public ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress) {
public final BootstrapConfig config() {
void init(Channel channel) {
final SocketAddress remoteAddress() {
final AddressResolverGroup<?> resolver() {
private ChannelFuture doResolveAndConnect(final SocketAddress remoteAddress, final SocketAddress localAddress) {
private ChannelFuture doResolveAndConnect0(final Channel channel, SocketAddress remoteAddress, final SocketAddress localAddress, final ChannelPromise promise) {
private static void doConnect(final SocketAddress remoteAddress, final SocketAddress localAddress, final ChannelPromise connectPromise) {
static {
DEFAULT_RESOLVER = DefaultAddressResolverGroup.INSTANCE;
}
}
ServerBootstrap:服务端启动器
public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel> {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(ServerBootstrap.class);
private final Map<ChannelOption<?>, Object> childOptions = new LinkedHashMap();
private final Map<AttributeKey<?>, Object> childAttrs = new ConcurrentHashMap();
private final ServerBootstrapConfig config = new ServerBootstrapConfig(this);
private volatile EventLoopGroup childGroup;
private volatile ChannelHandler childHandler;
public ServerBootstrap() {
}
public ServerBootstrap group(EventLoopGroup group) {
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value) {
public <T> ServerBootstrap childAttr(AttributeKey<T> childKey, T value) {
public ServerBootstrap childHandler(ChannelHandler childHandler) {
public ServerBootstrap validate() {
public ServerBootstrap clone() {
public final ServerBootstrapConfig config() {
final ChannelHandler childHandler() {
final Map<ChannelOption<?>, Object> childOptions() {
final Map<AttributeKey<?>, Object> childAttrs() {
void init(Channel channel) {
private ServerBootstrap(ServerBootstrap bootstrap) {
**********
内部类:ServerBootstrapAcceptor
private static class ServerBootstrapAcceptor extends ChannelInboundHandlerAdapter {
private final EventLoopGroup childGroup;
private final ChannelHandler childHandler;
private final Entry<ChannelOption<?>, Object>[] childOptions;
private final Entry<AttributeKey<?>, Object>[] childAttrs;
private final Runnable enableAutoReadTask;
ServerBootstrapAcceptor(final Channel channel, EventLoopGroup childGroup, ChannelHandler childHandler, Entry<ChannelOption<?>, Object>[] childOptions, Entry<AttributeKey<?>, Object>[] childAttrs) {
public void channelRead(ChannelHandlerContext ctx, Object msg) {
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
private static void forceClose(Channel child, Throwable t) {
线程组
EventExecutorGroup
public interface EventExecutorGroup extends ScheduledExecutorService, Iterable<EventExecutor> {
boolean isShuttingDown();
Future<?> terminationFuture();
Future<?> shutdownGracefully();
Future<?> shutdownGracefully(long var1, long var3, TimeUnit var5);
EventExecutor next();
Iterator<EventExecutor> iterator();
Future<?> submit(Runnable var1);
<T> Future<T> submit(Runnable var1, T var2);
<T> Future<T> submit(Callable<T> var1);
<V> ScheduledFuture<V> schedule(Callable<V> var1, long var2, TimeUnit var4);
ScheduledFuture<?> schedule(Runnable var1, long var2, TimeUnit var4);
ScheduledFuture<?> scheduleAtFixedRate(Runnable var1, long var2, long var4, TimeUnit var6);
ScheduledFuture<?> scheduleWithFixedDelay(Runnable var1, long var2, long var4, TimeUnit var6);
}
EventLoopGroup
public interface EventLoopGroup extends EventExecutorGroup {
EventLoop next();
ChannelFuture register(Channel var1);
ChannelFuture register(ChannelPromise var1);
}
NioEventLoopGroup
public class NioEventLoopGroup extends MultithreadEventLoopGroup {
public NioEventLoopGroup() {
this(0);
}
public NioEventLoopGroup(int nThreads) {
public NioEventLoopGroup(ThreadFactory threadFactory) {
public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory) {
public NioEventLoopGroup(int nThreads, Executor executor) {
public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory, SelectorProvider selectorProvider) {
public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory, SelectorProvider selectorProvider, SelectStrategyFactory selectStrategyFactory) {
public NioEventLoopGroup(int nThreads, Executor executor, SelectorProvider selectorProvider) {
public NioEventLoopGroup(int nThreads, Executor executor, SelectorProvider selectorProvider, SelectStrategyFactory selectStrategyFactory) {
public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, SelectorProvider selectorProvider, SelectStrategyFactory selectStrategyFactory) {
public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, SelectorProvider selectorProvider, SelectStrategyFactory selectStrategyFactory, RejectedExecutionHandler rejectedExecutionHandler) {
public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, SelectorProvider selectorProvider, SelectStrategyFactory selectStrategyFactory, RejectedExecutionHandler rejectedExecutionHandler, EventLoopTaskQueueFactory taskQueueFactory) {
public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, SelectorProvider selectorProvider, SelectStrategyFactory selectStrategyFactory, RejectedExecutionHandler rejectedExecutionHandler, EventLoopTaskQueueFactory taskQueueFactory, EventLoopTaskQueueFactory tailTaskQueueFactory) {
public void setIoRatio(int ioRatio) {
public void rebuildSelectors() {
protected EventLoop newChild(Executor executor, Object... args) throws Exception {
channel 类型
常用channel类(4.1.77 oio不推荐使用)
NioSocketChannel:tcp客户端
NioServerSocketChannel:tcp服务端
NioDatagramChannel:udp客户端、服务端
NioSctpChannel:sctp客户端
NioSctpServerChannel:sctp服务端
配置参数
ChannelOption
public class ChannelOption<T> extends AbstractConstant<ChannelOption<T>> {
private static final ConstantPool<ChannelOption<Object>> pool = new ConstantPool<ChannelOption<Object>>() {
protected ChannelOption<Object> newConstant(int id, String name) {
return new ChannelOption(id, name);
}
};
public static final ChannelOption<ByteBufAllocator> ALLOCATOR = valueOf("ALLOCATOR");
public static final ChannelOption<RecvByteBufAllocator> RCVBUF_ALLOCATOR = valueOf("RCVBUF_ALLOCATOR");
public static final ChannelOption<MessageSizeEstimator> MESSAGE_SIZE_ESTIMATOR = valueOf("MESSAGE_SIZE_ESTIMATOR");
public static final ChannelOption<Integer> CONNECT_TIMEOUT_MILLIS = valueOf("CONNECT_TIMEOUT_MILLIS");
public static final ChannelOption<Integer> MAX_MESSAGES_PER_WRITE = valueOf("MAX_MESSAGES_PER_WRITE");
public static final ChannelOption<Integer> WRITE_SPIN_COUNT = valueOf("WRITE_SPIN_COUNT");
public static final ChannelOption<WriteBufferWaterMark> WRITE_BUFFER_WATER_MARK = valueOf("WRITE_BUFFER_WATER_MARK");
public static final ChannelOption<Boolean> ALLOW_HALF_CLOSURE = valueOf("ALLOW_HALF_CLOSURE");
public static final ChannelOption<Boolean> AUTO_READ = valueOf("AUTO_READ");
public static final ChannelOption<Boolean> AUTO_CLOSE = valueOf("AUTO_CLOSE");
public static final ChannelOption<Boolean> SO_BROADCAST = valueOf("SO_BROADCAST");
public static final ChannelOption<Boolean> SO_KEEPALIVE = valueOf("SO_KEEPALIVE");
public static final ChannelOption<Integer> SO_SNDBUF = valueOf("SO_SNDBUF");
public static final ChannelOption<Integer> SO_RCVBUF = valueOf("SO_RCVBUF");
public static final ChannelOption<Boolean> SO_REUSEADDR = valueOf("SO_REUSEADDR");
public static final ChannelOption<Integer> SO_LINGER = valueOf("SO_LINGER");
public static final ChannelOption<Integer> SO_BACKLOG = valueOf("SO_BACKLOG");
public static final ChannelOption<Integer> SO_TIMEOUT = valueOf("SO_TIMEOUT");
public static final ChannelOption<Integer> IP_TOS = valueOf("IP_TOS");
public static final ChannelOption<InetAddress> IP_MULTICAST_ADDR = valueOf("IP_MULTICAST_ADDR");
public static final ChannelOption<NetworkInterface> IP_MULTICAST_IF = valueOf("IP_MULTICAST_IF");
public static final ChannelOption<Integer> IP_MULTICAST_TTL = valueOf("IP_MULTICAST_TTL");
public static final ChannelOption<Boolean> IP_MULTICAST_LOOP_DISABLED = valueOf("IP_MULTICAST_LOOP_DISABLED");
public static final ChannelOption<Boolean> TCP_NODELAY = valueOf("TCP_NODELAY");
public static final ChannelOption<Boolean> TCP_FASTOPEN_CONNECT = valueOf("TCP_FASTOPEN_CONNECT");
public static final ChannelOption<Integer> TCP_FASTOPEN = valueOf(ChannelOption.class, "TCP_FASTOPEN");
public static final ChannelOption<Boolean> SINGLE_EVENTEXECUTOR_PER_GROUP = valueOf("SINGLE_EVENTEXECUTOR_PER_GROUP");
public static <T> ChannelOption<T> valueOf(String name) {
public static <T> ChannelOption<T> valueOf(Class<?> firstNameComponent, String secondNameComponent) {
public static boolean exists(String name) {
public void validate(T value) {
private ChannelOption(int id, String name) {
channel pipeline
通过channel接口获取对应的channel pileline,添加自定义的handler
ChannelInitailizer
@Sharable
public abstract class ChannelInitializer<C extends Channel> extends ChannelInboundHandlerAdapter {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(ChannelInitializer.class);
private final Set<ChannelHandlerContext> initMap = Collections.newSetFromMap(new ConcurrentHashMap());
public ChannelInitializer() {
}
protected abstract void initChannel(C var1) throws Exception;
//channel初始化
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
public final void channelRegistered(ChannelHandlerContext ctx) throws Exception {
private boolean initChannel(ChannelHandlerContext ctx) throws Exception {
private void removeState(final ChannelHandlerContext ctx) {
Channel
public interface Channel extends AttributeMap, ChannelOutboundInvoker, Comparable<Channel> {
ChannelId id();
EventLoop eventLoop();
Channel parent();
ChannelConfig config();
boolean isOpen();
boolean isRegistered();
boolean isActive();
boolean isWritable();
long bytesBeforeUnwritable();
long bytesBeforeWritable();
SocketAddress localAddress();
SocketAddress remoteAddress();
ChannelFuture closeFuture();
ChannelMetadata metadata();
Channel.Unsafe unsafe();
ChannelPipeline pipeline(); //获取channel pipeline
ByteBufAllocator alloc();
Channel read();
Channel flush();
********
内部接口:Unsafe
public interface Unsafe {
Handle recvBufAllocHandle();
SocketAddress localAddress();
SocketAddress remoteAddress();
void register(EventLoop var1, ChannelPromise var2);
void deregister(ChannelPromise var1);
void bind(SocketAddress var1, ChannelPromise var2);
void connect(SocketAddress var1, SocketAddress var2, ChannelPromise var3);
void disconnect(ChannelPromise var1);
void close(ChannelPromise var1);
void closeForcibly();
void beginRead();
void write(Object var1, ChannelPromise var2);
void flush();
ChannelPromise voidPromise();
ChannelOutboundBuffer outboundBuffer();
}
}
ChannelPipeline
public interface ChannelPipeline extends ChannelInboundInvoker, ChannelOutboundInvoker, Iterable<Entry<String, ChannelHandler>> {
*******
add 操作
ChannelPipeline addFirst(String var1, ChannelHandler var2);
ChannelPipeline addFirst(EventExecutorGroup var1, String var2, ChannelHandler var3);
ChannelPipeline addLast(String var1, ChannelHandler var2);
ChannelPipeline addLast(EventExecutorGroup var1, String var2, ChannelHandler var3);
ChannelPipeline addBefore(String var1, String var2, ChannelHandler var3);
ChannelPipeline addBefore(EventExecutorGroup var1, String var2, String var3, ChannelHandler var4);
ChannelPipeline addAfter(String var1, String var2, ChannelHandler var3);
ChannelPipeline addAfter(EventExecutorGroup var1, String var2, String var3, ChannelHandler var4);
ChannelPipeline addFirst(ChannelHandler... var1);
ChannelPipeline addFirst(EventExecutorGroup var1, ChannelHandler... var2);
ChannelPipeline addLast(ChannelHandler... var1);
ChannelPipeline addLast(EventExecutorGroup var1, ChannelHandler... var2);
*******
remove 操作
ChannelHandler remove(String var1);
ChannelHandler removeFirst();
ChannelHandler removeLast();
ChannelPipeline remove(ChannelHandler var1);
<T extends ChannelHandler> T remove(Class<T> var1);
*******
replace 操作
ChannelPipeline replace(ChannelHandler var1, String var2, ChannelHandler var3);
ChannelHandler replace(String var1, String var2, ChannelHandler var3);
<T extends ChannelHandler> T replace(Class<T> var1, String var2, ChannelHandler var3);
*******
获取ChannelHandler
ChannelHandler first();
ChannelHandler last();
ChannelHandler get(String var1);
<T extends ChannelHandler> T get(Class<T> var1);
*******
获取ChannelHandlerContext
ChannelHandlerContext firstContext();
ChannelHandlerContext lastContext();
ChannelHandlerContext context(ChannelHandler var1);
ChannelHandlerContext context(String var1);
ChannelHandlerContext context(Class<? extends ChannelHandler> var1);
*******
触发channel事件
ChannelPipeline fireChannelRegistered();
ChannelPipeline fireChannelUnregistered();
ChannelPipeline fireChannelActive();
ChannelPipeline fireChannelInactive();
ChannelPipeline fireExceptionCaught(Throwable var1);
ChannelPipeline fireUserEventTriggered(Object var1);
ChannelPipeline fireChannelRead(Object var1);
ChannelPipeline fireChannelReadComplete();
ChannelPipeline fireChannelWritabilityChanged();
*******
其余操作
Channel channel(); //获取pipeline对应的channel
List<String> names(); //获取handler名称集合
Map<String, ChannelHandler> toMap(); //获取handler及其对应的name
ChannelPipeline flush(); //刷新pipeline
}
ChannelHandler
public interface ChannelHandler {
void handlerAdded(ChannelHandlerContext var1) throws Exception;
void handlerRemoved(ChannelHandlerContext var1) throws Exception;
/** @deprecated */
@Deprecated
void exceptionCaught(ChannelHandlerContext var1, Throwable var2) throws Exception;
@Inherited
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Sharable {
}
}
ChannelHandlerContext
public interface ChannelHandlerContext extends AttributeMap, ChannelInboundInvoker, ChannelOutboundInvoker {
String name();
Channel channel();
boolean isRemoved();
EventExecutor executor();
ChannelHandler handler();
ByteBufAllocator alloc();
ChannelPipeline pipeline();
ChannelHandlerContext read();
ChannelHandlerContext flush();
ChannelHandlerContext fireChannelRegistered();
ChannelHandlerContext fireChannelUnregistered();
ChannelHandlerContext fireChannelActive();
ChannelHandlerContext fireChannelInactive();
ChannelHandlerContext fireExceptionCaught(Throwable var1);
ChannelHandlerContext fireUserEventTriggered(Object var1);
ChannelHandlerContext fireChannelRead(Object var1);
ChannelHandlerContext fireChannelReadComplete();
ChannelHandlerContext fireChannelWritabilityChanged();
/** @deprecated */
@Deprecated
<T> Attribute<T> attr(AttributeKey<T> var1);
/** @deprecated */
@Deprecated
<T> boolean hasAttr(AttributeKey<T> var1);
}