mina - IoSession

介绍

会话是MINA的核心 :每次客户端连接到服务器时,都会在服务器上创建一个新会话,并将保留在内存中,直到客户端断开连接。

会话用于存储有关连接的持久性信息,以及客户端或服务器在请求处理期间以及最终在整个会话生命周期期间可能需要使用的任何类型的信息。

这也是您需要在会话上执行的任何操作的接入点:发送消息,关闭会话等…

至关重要的是要理解,由于NIO的不耐烦性质,从会话中阅读没有多大意义。实际上,当一些传入消息到达时,您的应用程序就会发出信号,这就是负责处理此类事件的 IoHandler。
换句话说,不要调用 session.read()。从不。

会话状态

会话具有一种状态,该状态将随时间演变。

  • 已连接:会话已创建且可用
  • 空闲:会话至少在一段时间内未处理任何请求(此时间段是可配置的)
    • 空闲读取:实际上在一段时间内没有读取
    • 空闲写入:在一段时间内实际上没有写入
    • 两者均空闲:一段时间内不读取或写入
  • 关闭:会话正在关闭(正在刷新其余消息,清理未终止)
  • 已关闭 :会话现已关闭,无法执行任何其他操作来恢复它。这实际上不是一个真实的状态 :当会话关闭时,它会被删除。
  • 在这里插入图片描述
  • isActive(): 告诉会话是否有效(根据实现的不同,它可能意味着不同的东西)
  • isClosing(): 告诉会话是否已经关闭
  • isConnected(): 告诉会话是否处于活动状态(即,不在关闭模式下)

关闭会话

  • 调用 closeNow() 方法(显式)
  • 调用 closeOnFlush() 方法(显式)
  • 客户端友好地关闭连接时
  • 如果发生异常

请注意,如果远程对等方不再连接,则您使用 closeOnFlush() 调用关闭的会话将永远不会被销毁,除非您还处理了它的空闲状态,或者在系统 TCP 超时关闭套接字之前 - 这可能 需要几个小时-。 始终管理应用程序中的空闲状态。

远程客户端关闭

当远程客户端正确关闭会话时,会话将被关闭,所有未决消息将被丢弃。 这通常是它的工作方式。

但是,有时,远程客户端没有正确关闭连接(当电缆被粗暴地拔掉时,可能会发生这种情况)。 在这种情况下,会话永远不会收到有关断开连接的通知。 了解它的唯一方法是定期检查会话状态:如果空闲时间超过特定时间 - 必须进行配置 - 则应用程序可以决定关闭会话。 否则,会话最终将在达到 TCP 超时时关闭(可能需要数小时……)。

Exception

在某些情况下,将发生异常,导致会话关闭。通常,在创建会话时,我们可能会遇到问题,并且会话将立即关闭。另一种可能性是我们无法编写某些消息,例如,因为通道已关闭:然后关闭会话。

总而言之,每次我们在处理会话时遇到异常时,此会话都将关闭。

当然,您的应用程序将通过 ExceptionCaught 事件收到通知。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,mina-filter是一个用于Apache MINA(Multipurpose Infrastructure for Network Applications)框架的过滤器。MINA是一个基于Java网络应用程序框架,用于开发高性能和可扩展的网络应用程序。 MINA框架使用过滤器链来处理输入和输出数据。过滤器链由多个过滤器组成,每个过滤器负责处理特定的任务,例如数据压缩、数据加密、协议解析等。过滤器链可以根据应用程序的需求进行配置和定制。 以下是一个使用mina-filter的示例: ```java import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.filterchain.IoFilterAdapter; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.logging.LoggingFilter; public class MinaFilterExample { public static void main(String[] args) { // 创建过滤器链 DefaultIoFilterChainBuilder filterChain = new DefaultIoFilterChainBuilder(); // 添加日志过滤器 filterChain.addLast("logger", new LoggingFilter()); // 添加协议编解码过滤器 filterChain.addLast("codec", new ProtocolCodecFilter(new MyProtocolCodecFactory())); // 添加自定义过滤器 filterChain.addLast("myFilter", new MyFilter()); // 创建MINA服务器 NioSocketAcceptor acceptor = new NioSocketAcceptor(); acceptor.setFilterChainBuilder(filterChain); // 启动服务器 try { acceptor.bind(new InetSocketAddress(8888)); System.out.println("Server started on port 8888"); } catch (IOException e) { e.printStackTrace(); } } // 自定义协议编解码工厂 private static class MyProtocolCodecFactory implements ProtocolCodecFactory { // 实现编解码逻辑 // ... } // 自定义过滤器 private static class MyFilter extends IoFilterAdapter { @Override public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception { // 处理接收到的消息 // ... } @Override public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { // 处理发送的消息 // ... } } } ``` 上述示例中,我们创建了一个MINA服务器,并配置了一个过滤器链。过滤器链包括日志过滤器、协议编解码过滤器和自定义过滤器。日志过滤器用于记录日志信息,协议编解码过滤器用于处理数据的编码和解码,自定义过滤器用于处理接收和发送的消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值