首页 > OOP语言 > 其它 > 正文

使用 Apache MINA 2 开发网络应用
2012-03-28 00:00:00   来源:www.bianceng.cn   评论:0 点击:

暂时无描述信息

AbstractTetrisCommand用来描述联机游戏示例应用中的消息。它是一个抽象类,是所有具体消息的基类。其具体实现如 清单 5 所示。

清单 5. 联机游戏示例应用中的消息 AbstractTetrisCommand

public abstract class AbstractTetrisCommand implements TetrisCommand {
  public abstract String getName();

  public abstract byte[] bodyToBytes() throws Exception;

  public abstract void bodyFromBytes(byte[] bytes) throws Exception;

  public byte[] toBytes() throws Exception {
    byte[] body = bodyToBytes();
    int commandNameLength = Constants.COMMAND_NAME_LENGTH;
    int len = commandNameLength + body.length;
    byte[] bytes = new byte[len];
    String name = StringUtils.rightPad(getName(), commandNameLength,
      Constants.COMMAND_NAME_PAD_CHAR);
    name = name.substring(0, commandNameLength);
    System.arraycopy(name.getBytes(), 0, bytes, 0, commandNameLength);
    System.arraycopy(body, 0, bytes, commandNameLength, body.length);
    return bytes;
  }
}

如 清单 5 所示,AbstractTetrisCommand 中定义了 3 个抽象方法:getName、bodyToBytes 和 bodyFromBytes,分别用来获取消息的名称、把消息的主体转换成字节数组和从字节数组中构建消息。bodyToBytes对应于前面提到的“编码”过程,而 bodyFromBytes对应于“解码”过程。每种具体的消息都应该实现这 3 个方法。AbstractTetrisCommand 中的方法 toBytes 封装了把消息的主体转换成字节数组的逻辑,在字节数组中,首先是长度固定为 Constants.COMMAND_NAME_LENGTH的消息类别名称,紧接着是每种消息特定的主体内容,由 bodyToBytes 方法来生成。

在介绍完示例应用中的消息格式之后,下面将讨论具体的“编码”和“解码”过程。“编码”过程由编码器来完成,编码器需要实现 org.apache.mina.filter.codec.ProtocolEncoder 接口,一般来说继承自 org.apache.mina.filter.codec.ProtocolEncoderAdapter 并覆写所需的方法即可。清单 6 中给出了示例应用中消息编码器 CommandEncoder 的实现。

清单 6. 联机游戏示例应用中消息编码器 CommandEncoder

public class CommandEncoder extends ProtocolEncoderAdapter {

  public void encode(IoSession session, Object message,
    ProtocolEncoderOutput out) throws Exception {
    AbstractTetrisCommand command = (AbstractTetrisCommand) message;
    byte[] bytes = command.toBytes();
    IoBuffer buf = IoBuffer.allocate(bytes.length, false);

    buf.setAutoExpand(true);
    buf.putInt(bytes.length);
    buf.put(bytes);

    buf.flip();
    out.write(buf);
  }
}

相关热词搜索:

上一篇:使用Blueprint Container规范构建OSGi应用程序
下一篇:结合使用 Apache Geronimo 和 Lift

分享到: 收藏