mina基础及服务端接口测试

发表于:2013-12-16 11:06

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陈磊    来源:51Testing软件测试网采编

  3、IoSession
  IoSession是用来保持IoService的上下文,一个IoService在建立连接之后建立一个IoSession(一个连接一个session),IoSession的生命周期从Connection建立到断开为止。
  主要功能:
  1、管理连接(session.getSessionConfig.XX)。这里的管理连接并不是直接去控制我们上次讲的最底层的连接acceptor和connector。如果acceptor和connector建立的一条管道,那session就是在管道内的管理者,他是没有办法将管道对半拆分开的,他只能从内部阻断两边的通信。管理连接还有部分就是可以配置缓冲区的大小,闲置时间等等。
  2、存储信息(session.setAttribute())。和web里的session一样,这里的session也有存储attribute的功能,不过一般来说,这里存储的都是和连接有关的东西,并不会像web开发一样存一些业务上的东西。
  3、驱动读写操作。如session.write()。
  4、统计功能。Session还记录了连接中的byte、message等数量。
  4、IoHandler
public interface IoHandler {
void sessionCreated(IoSession session) throws Exception;
void sessionOpened(IoSession session) throws Exception;
void sessionClosed(IoSession session) throws Exception;
void sessionIdle(IoSession session, IdleStatus status) throws Exception;
void exceptionCaught(IoSession session, Throwable cause) throws Exception;
void messageReceived(IoSession session, Object message) throws Exception;
void messageSent(IoSession session, Object message) throws Exception;
}
  一般情况下,我们最关心的只有messageReceived方法,接收消息并处理,然后调用IoSession的write方法发送出消息。一般情况下很少有人实现IoHandler接口,而是继承它的一个实现类IoHandlerAdapter,这样不用覆盖它的7个方法,只需要根据具体需求覆盖其中的几个方法就可以。
  5、IoFilter
  Mina最主要的工作就是把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的结果转换为字节码,交给底层传输。这些都是由IoFilter完成的。
  Filter,过滤器的意思。IoFilter,I/O操作的过滤器。IoFilter和Servlet中的过滤器一样,主要用于拦截和过滤网络传输中I/O操作的各种消息。
  IoService实例会绑定一个DefaultIoFilterChainBuilder ---- 过滤器链,我们把自定义的各种过滤器(IoFilter)自由的插放在这个过滤器链上了。
  Mina中自带的解码器:
  CumulativeProtocolDecoder 累积性解码器
  SynchronizedProtocolDecoder 这个解码器用于将任何一个解码器包装为一个线程安全的解码器,用于解决每次执行decode()方法时可能线程不是上一次的线程的问题,但这样会在高并发时,大大降低系统的性能。
  TextLineDecoder 按照文本的换行符( Windows:\r\n 、Linux:\n、Mac:\r)解码数据。
  如何自定义编解码?
  1.继承相关编解码器类,重写实现doDecode/doEncode方法
  2.重写ProtocolCodecFactory工厂类
  三、如何测试mina的服务端
  1、创建自己的mina客户端
public IoConnector creatClient() {
NioSocketConnector connector = null;
try {
connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(1024 * 1024 * 5);
connector.getSessionConfig().setBothIdleTime(10);
connector.getSessionConfig().setKeepAlive(true);
connector.setHandler(new MyIoHandler());
connector.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new DecodeFactory()));
connector.setConnectTimeoutMillis(5000);
} catch (Exception e) {
e.printStackTrace();
}
return connector;
}
  2、重写Hanlder类,其中最重要的messageReciever方法需要先写好如何处理收到的数据,包括断言等
@Override
public void sessionCreated(IoSession session) throws Exception {
logger.info("服务端与客户端创建连接...");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
logger.info("服务端与客户端连接打开..."+ "当前第" + session.getId() + "个客户端");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
if (message instanceof IoBuffer) {
ServerResponse.getResponseInfo(session,(IoBuffer)message);
}
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
logger.info("服务端发送信息成功...");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
logger.info("服务端与客户端连接断开...");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
logger.info("服务端进入空闲状态...");
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
logger.error("服务端发送异常...", cause);
}
32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号