zoukankan      html  css  js  c++  java
  • netty源码解析(4.0)-2 Chanel的接口设计

    全名: io.netty.channel.Channel
    Channel内部定义了一个Unsafe类型,Channel定义了对外提供的方法,Unsafe定义了具体实现。我把Channel定义的的方法分为三种类型:
    • 辅助方法。
    • outbound方法
    • inbound方法
    下面依次对这三种方法给予详细说明:
     
    1. 辅助方法
    方法
    说明
    EventLoop eventLoop()
    得到EventLoop实例,每个Channel实例都会被注册到一个EventLoop中,这个EventLoop实例就是Channel注册的实例。
    Channel parent()
    得到父Channel实例。如: channelB = channelA.accept(), 那么channelA就是channelB的parent。
    ChannelConfig config()
    得到Channel实例的配置信息。
    boolean isOpen()                                                                                      
    channel是否处于open状态。netty为每个channel定义了四种状态open->registered->active->closed。一个新创建的channel处于open状态,随后他被注册到一个eventloop中它处于open+registered状态,当这个channel上的连接建立成功后它处于open+registered+active状态,被关闭后处于closed状态。
    boolean isRegistered()
    channel是否处于registered状态。
    boolean isActive()
    channel是否处于active状态。
    SocketAddress localAddress()
    channel的本地bind的地址。
    SocketAddress remoteAddress()
    channel连接的远程channel的地址。
    boolean isWritable()
    channel的I/O线程是否可以立即执操作。
    Unsafe unsafe()
    得到channel内部的Unsafe实例。
    ChannelPipeline pipeline()
    得到channel内部的ChannelPipeline实例。
    ByteBufAllocator alloc()
    channel持有的buffer分配器。
     
    2. outbound方法
    方法
    说明
    ChannelFuture bind(SocketAddress localAddress)
    ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise)
    让channel绑定的指定的本地地址(localAddress)上。这个方法会触发ChannelOutboundHandler#bind(ChannelHandlerContext, SocketAddress, ChannelPromise)方法的调用。
    ChannelFuture connect(SocketAddress remoteAddress)
    ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress)
    ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise)
    连接到远程地址(remoteAddress), 这个方法会触发ChannelOutboundHandler#connect(ChannelHandlerContext, SocketAddress, SocketAddress, ChannelPromise)方法的调用。
    ChannelFuture disconnect()
    ChannelFuture disconnect(ChannelPromise promise);
    断开连接, 这个方法会触发ChannelOutboundHandler#disconnect(ChannelHandlerContext, ChannelPromise)的调用。
    ChannelFuture close()
    ChannelFuture close(ChannelPromise promise)
    关闭channel. 这个方法会触发ChannelOutboundHandler#close(ChannelHandlerContext, ChannelPromise)的调用。
    ChannelFuture deregister()
    ChannelFuture deregister(ChannelPromise promise)
    从eventloop中注销这个channel,这个方法会触发ChannelOutboundHandler#deregister(ChannelHandlerContext, ChannelPromise)的调用。
    ChannelFuture write(Object msg)
    ChannelFuture write(Object msg, ChannelPromise promise)
    向channel写入数据,这个操作不会导致真正写操作,只会把数据追加到输出缓冲区中。它会触发ChannelOutboundHandler#write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)调用。
    Channel flush()
    对输出缓冲区中的数据执行真正的写操作,调用这个方法后连接的另一端才能收到write的数据,它会触发ChannelOutboundHandler#flush(ChannelHandlerContext ctx)调用。
    ChannelFuture writeAndFlush(Object msg, ChannelPromise promise)
    ChannelFuture writeAndFlush(Object msg)
    效果和先调用write然后调用flush一样。
     
    3. inbound方法
    方法
    说明
    Channel read()                                                                                        
    从channel中读取数据,把数据放到输入缓冲区中,然后触发ChannelInboundHandler#channelRead(ChannelHandlerContext, Object)和ChannelInboundHandler#channelReadComplete(ChannelHandlerContext)调用,如果之前已经有一个read操作正在执行或等待执行,这个方法不会有任何影响。
     
    Unsafe接口定义
    方法
    说明
    SocketAddress localAddress()
    同Channel
    SocketAddress remoteAddress()
    同Channel
    void register(EventLoop eventLoop, ChannelPromise promise)
    同Channel,
    void bind(SocketAddress localAddress, ChannelPromise promise)
    同Channel, 必须在I/O线程中执行
    void connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise)
    同Channel, 必须在I/O线程中执行
    void disconnect(ChannelPromise promise)
    同Channel, 必须在I/O线程中执行
    void close(ChannelPromise promise)
    同Channel, 必须在I/O线程中执行
    void closeForcibly()
    立即关闭channel,并且不触发任何事件。
    void deregister(ChannelPromise promise)
    同Channel, 必须在I/O线程中执行
    void beginRead()
    为channel触发read事件做准备。如:把read事件注册到NIO 的selector上。 必须在I/O线程中执行 必须在I/O线程中执行
    void write(Object msg, ChannelPromise promise)
    同Channel, 必须在I/O线程中执行
    void flush()
    同Channel, 必须在I/O线程中执行
    ChannelOutboundBuffer outboundBuffer()
    得到channel的输出缓冲区,write的数据就是追加到这个缓冲区中。 必须在I/O线程中执行
     
     
     

  • 相关阅读:
    Get-CrmSetting返回Unable to connect to the remote server的解决办法
    Dynamics 365中的常用Associate和Disassociate消息汇总
    Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
    Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法
    Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录
    注意,更改团队所属业务部门用Update消息无效!
    Dynamics 365的审核日志分区删除超时报错怎么办?
    Dynamics 365使用Execute Multiple Request删除系统作业实体记录
    Dynamics 365的系统作业实体记录增长太快怎么回事?
    Dynamics CRM日期字段查询使用时分秒的方法
  • 原文地址:https://www.cnblogs.com/brandonli/p/9919562.html
Copyright © 2011-2022 走看看