Netty学习:Channel及其内部接口Unsafe

连接到网络套接字或组件的一种连接,它能够进行I/O操作,如读、写、连接和绑定。

通道为用户提供:

  • 通道的当前状态(例如是否打开?)它是连接吗?)
  • 通道的{@linkplain ChannelConfig配置参数}(如接收缓冲区大小),
  • 通道支持的I/O操作(例如读、写、连接和绑定)
  • {@link ChannelPipeline}处理与通道关联的所有I/O事件和请求。

所有I/O操作都是异步的。

Netty中的所有I/O操作都是异步的。这意味着任何I/O调用都将立即返回,并且不能保证在调用结束时已完成所请求的I/O操作。相反,您将返回一个{@link ChannelFuture}实例,该实例将在请求的I/O操作成功、失败或取消时通知您。

通道是分层的

根据创建的方式,{@link Channel} 可以具有{@linkplain #parent() parent}。例如,一个被{@link ServerSocketChannel}接受的{@link SocketC层次结构的语义取决于{@link Channel}所属的传输实现。例如,您可以编写一个新的{@link Channel}实现来创建共享一个套接字连接的子通道,就像<a href="http://beepcore.org/">BEEP</a>和<a href="http://en.wikipedia.org/wiki/Secure_Shell">SSH</a>所做的那样。hannel}将返回{@link ServerSocketChannel}作为它的父节点通过{@link #parent()}。

向下转换以访问特定于传输的操作

一些传输公开特定于传输的其他操作。将{@link Channel}向下转换为子类型以调用此类操作。例如,对于旧的I/O数据报传输,多播连接/离开操作由{@link DatagramChannel}提供。

释放资源

 调用{@link #close()}或{@link #close(ChannelPromise)}来释放使用{@link通道}后的所有资源是很重要的。这可以确保以适当的方式释放所有资源,即文件句柄。

ChannelId id();返回此{@link Channel}的全局惟一标识符。

EventLoop eventLoop();返回这个{@link Channel}注册到的{@link EventLoop}。

Channel parent();返回该通道的父通道。如果该通道没有父通道,则为{@code null}。

ChannelConfig config();返回该通道的配置。

 boolean isOpen();如果{@link Channel}是打开的,并且稍后可能激活,则返回{@code true}

boolean isRegistered();如果{@link Channel}已注册在{@link EventLoop},则返回{@code true}。

boolean isActive();如果{@link Channel}处于活动状态并已连接,则返回{@code true}。

ChannelMetadata metadata();返回通道的元数据,它描述了{@link Channel}的性质。

 SocketAddress localAddress();返回该通道绑定到的本地地址。返回的{@link SocketAddress}应该向下转换为更具体的类型,例如{@link InetSocketAddress}来检索详细信息。

SocketAddress remoteAddress();返回该通道连接到的远程地址。返回的{@link SocketAddress}应该向下转换为更具体的类型,例如{@link InetSocketAddress}来检索详细信息。返回该通道的远程地址。如果该通道未连接,则为{@code null}。如果这个通道没有连接,但是它可以接收来自任意远程地址的消息(例如,{@link DatagramChannel},使用{@link DatagramPacket# receiver()}来确定接收到的消息的来源,因为这个方法将返回{@code null}。

ChannelFuture closeFuture();返回{@link ChannelFuture},该通道关闭时将通知该{@link ChannelFuture}。这个方法总是返回相同的将来实例。

boolean isWritable();当且仅当I/O线程将立即执行所请求的写操作时,返回{@code true}。当这个方法返回{@code false}时发出的任何写请求都将排队,直到I/O线程准备好处理排队的写请求。

 long bytesBeforeUnwritable();获取在{@link #isWritable()}返回{@code false}之前可以写入多少字节。这个量总是非负的。如果{@link #isWritable()}是{@code false},则为0。

 long bytesBeforeWritable();获取必须从底层缓冲区中提取多少字节,直到{@link #isWritable()}返回{@code true}。这个量总是非负的。如果{@link #isWritable()}为{@code true}则为0。

Unsafe unsafe();返回提供不安全操作的<em>内部使用对象</em>。

ChannelPipeline pipeline();返回指定的{@link ChannelPipeline}。

ByteBufAllocator alloc();返回分配的{@link ByteBufAllocator},它将用于分配{@link ByteBuf}s。

Channel read();

Channel flush();

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Unsafe

<em>不安全</em>操作,应该<em>永远不应该</em>从用户代码调用。这些方法仅用于实现实际传输,必须从I/O线程调用,以下方法除外:

     * <ul>
     *   <li>{@link #localAddress()}</li>
     *   <li>{@link #remoteAddress()}</li>
     *   <li>{@link #closeForcibly()}</li>
     *   <li>{@link #register(EventLoop, ChannelPromise)}</li>
     *   <li>{@link #deregister(ChannelPromise)}</li>
     *   <li>{@link #voidPromise()}</li>
     * </ul>

RecvByteBufAllocator.Handle recvBufAllocHandle();返回指定的{@link RecvByteBufAllocator.Handle},用于在接收数据时分配{@link ByteBuf}的。

SocketAddress localAddress();返回绑定到本地的{@link SocketAddress},如果没有,返回{@code null}。

SocketAddress remoteAddress();返回远程绑定到的{@link SocketAddress},如果还没有绑定,则返回{@code null}。

void register(EventLoop eventLoop, ChannelPromise promise);注册{@link ChannelPromise}的{@link Channel},注册完成后通知{@link ChannelFuture}。

void bind(SocketAddress localAddress, ChannelPromise promise);将{@link SocketAddress}绑定到{@link ChannelPromise}的{@link Channel},并在完成后通知它。

void connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise);将给定的{@link ChannelFuture}的{@link Channel}与给定的远程{@link SocketAddress}连接起来。如果应该使用特定的本地{@link SocketAddress},则需要将其作为参数给出。否则就将{@code null}传递给它。

 void disconnect(ChannelPromise promise);断开{@link ChannelFuture}的{@link Channel},操作完成后通知{@link ChannelPromise}。

void close(ChannelPromise promise);关闭{@link ChannelPromise}的{@link Channel},操作完成后通知{@link ChannelPromise}。

void closeForcibly();立即关闭{@link Channel},不触发任何事件。可能只有注册失败时才有用。

void deregister(ChannelPromise promise);从{@link EventLoop}注销{@link ChannelPromise}的{@link Channel},操作完成后通知{@link ChannelPromise}。

void beginRead();调度一个读取操作,该操作填充{@link ChannelPipeline}中第一个{@link ChannelInboundHandler}的入站缓冲区。如果已经有一个挂起的读操作,这个方法什么也不做。

void write(Object msg, ChannelPromise promise);高度一个写操作。

void flush();清除所有通过{@link #write(Object, ChannelPromise)}调度的写操作。

ChannelPromise voidPromise();返回一个特殊的ChannelPromise,它可以被重用并传递给{@link Unsafe}中的操作。它永远不会被通知成功或错误,所以它只是一个占位符,用于那些以{@link ChannelPromise}为参数但您不想被通知的操作。

ChannelOutboundBuffer outboundBuffer();返回存储暂挂写请求的{@link Channel}的{@link ChannelOutboundBuffer}。

猜你喜欢

转载自blog.csdn.net/AnY11/article/details/84942750