OFMessageDecoder 分析


     OFMessageDecoder 继承了抽象类 FrameDecoder。FrameDecoder 会将接收到的ChannelBuffers 转换成有意义的 frame 对象。在基于流的传输过程中,一般会发生分片和重组的情况,所以就须要一个解码器。依据特定协议的约束,将收到的包理解为相应的。易于应用逻辑层处理的对象。

代码例如以下:
public class OFMessageDecoder extends FrameDecoder {

     OFMessageFactory factory = new BasicFactory();

      // 实现父类的抽象方法,最后一个參数 buffer:
      // buffer the cumulative buffer of received packets so far.
      // Note that the buffer might be empty, which means you
      // should not make an assumption that the buffer contains
      // at least one byte in your decoder implementation.
      @Override
      protected Object decode(ChannelHandlerContext ctx, Channel channel,
              ChannelBuffer buffer) throws Exception {
          List<OFMessage> message = factory .parseMessage(buffer);
           return message;
     }
}
这个decode抽象方法会被FrameDecoder的messageReceived方法所调用,FrameDecoder也是一个UpstreamHandler,当有数据到达的时候就会收集数据到ChannelBuffer中而后解码。

这里调用的是 BasicFactory 的 parseMessage 方法。一次处理一个of msg。然后加入到链表中。这里重要的条件就是 openflow header 的长度和消息类型,然后调用枚举类型中个体的newinstance()方法生成相应的OFMessage。


public List< OFMessage> parseMessage(ChannelBuffer data) throws MessageParseException {
    List<OFMessage> msglist = new ArrayList< OFMessage>();
    OFMessage msg = null;

    while (data.readableBytes() >= OFMessage.MINIMUM_LENGTH) {
        data.markReaderIndex();
       msg = this .parseMessageOne(data);
        if (msg == null ) {
            data.resetReaderIndex();
            break ;
        }
        else {
            msglist.add(msg);
        }
    }

    if (msglist.size() == 0) {
        return null ;
    }
    return msglist;
}

这样就使得进入流水线的全部信息都是详细的 OFMessage 便于各个模块的处理。





【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/ldxsuanfa/p/10669049.html