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

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

暂时无描述信息

BlacklistFilter

BlacklistFilter是 Apache MINA 自带的一个过滤器实现,其功能是阻止来自特定地址的连接,即所谓的“黑名单”功能。BlacklistFilter继承自 IoFilterAdapter,并覆写了 IoHandler相关的方法。清单 4 中给出了部分实现。

清单 4. 阻止来自特定地址连接的 BlacklistFilter

public void messageReceived(NextFilter nextFilter, IoSession session, Object message) {
  if (!isBlocked(session)) {
    nextFilter.messageReceived(session, message);
  } else {
    blockSession(session);
  }
}

private void blockSession(IoSession session) {
  session.close(true);
}

在 清单 4 中 messageReceived 方法的实现中,首先通过 isBlocked 来判断当前连接是否应该被阻止,如果不是的话,则通过 nextFilter.messageReceived 把该 I/O 事件传递到下一个过滤器;否则的话,则通过 blockSession 来阻止当前连接。

使用 ProtocolCodecFilter

ProtocolCodecFilter 用来在字节流和消息对象之间互相转换。当该过滤器接收到字节流的时候,需要首先判断消息的边界,然后把表示一条消息的字节提取出来,通过一定的逻辑转换成消息对象,再把消息对象往后传递,交给 I/O 处理器来执行业务逻辑。这个过程称为“解码”。与“解码”对应的是“编码”过程。在“编码”的时候,过滤器接收到的是消息对象,通过与“解码”相反的逻辑,把消息对象转换成字节,并反向传递,交给 I/O 服务来执行 I/O 操作。

在“编码”和“解码”中的一个重要问题是如何在字节流中判断消息的边界。通常来说,有三种办法解决这个问题:

使用固定长度的消息。这种方式实现起来比较简单,只需要每次读取特定数量的字节即可。

使用固定长度的消息头来指明消息主体的长度。比如每个消息开始的 4 个字节的值表示了后面紧跟的消息主体的长度。只需要首先读取该长度,再读取指定数量的字节即可。

使用分隔符。消息之间通过特定模式的分隔符来分隔。每次只要遇到该模式的字节,就表示到了一个消息的末尾。

具体到示例应用来说,客户端和服务器之间的通信协议比较复杂,有不同种类的消息。每种消息的格式都不相同,同类消息的内容也不尽相同。因此,使用固定长度的消息头来指明消息主体的长度就成了最好的选择。

示例应用中的每种消息主体由两部分组成,第一部分是固定长度的消息类别名称,第二部分是每种消息的主体内容。图 4 中给出了示例应用中一条完整的消息的结构。

图 4. 示例应用中消息的结构

\

相关热词搜索:

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

分享到: 收藏