一、学习资料
Mina入门实例(一)
Mina入门教程(二)----Spring4 集成Mina
Apache Mina 入门实例——创建一个MINA时间服务
MINA2.0用户手册中文版——系列文档mina 心跳机制
出处:mina框架详解
mina编码器详解
Mina系列文章索引(解码解析等,不错)
二、代码示例
(1)Mina服务端创建步骤1.建立监听对象IoAcceptor acceptor=new NioSocketAcceptor();2.添加Filter(日志,编解码)acceptor.getFilterChain().addLast("logger",new LoggingFilter());acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));3.添加Handler处理
acceptor.setHandler(new TimeServerHandler());4.设置回话参数【输入缓存区Buffer大小,多久进入空闲时间】
acceptor.getSessionConfig.setReadBufferSize(2048);acceptor.getessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);5.绑定端口号,开始监听
acceptor.bind(new InetSocketAddress(PORT));Handler处理类开发
继承IOHandler类或者实现IoHandler接口客户端Handler,服务端Handler使用同一个IOHandler继承实现。public TimeServerHandler extends IoHandlerAdapter{ @Overridepublic void exceptionCaught(IoSession session,Throwable cause) throws Exception{ cause.printStackTrace();}@Override
public void messageReceived(IoSession session,Object message) throws Exception{ String str=message.toString();if(str.trim().equalsIgnoreCase("quit")){ session.close();return ;}Date date=new Date();
session.write(date.toString());System.out.println("Message written...");}@Override
public void sessionIdle(IoSession session,IdleStatus status) throws Exception{ System.out.println("IDLE"+session.getIdleCount(status));}}exceptionCaught方法:捕获错误,简单地打印了错误的堆栈跟踪和关闭会话。
messageReceived方法:来处理从客户端接收到的数据,这里是将当前时间返回给客户端。根据所使用的协议编解码器,object 这个参数传递的类型有所不同,以及返回的数据时的session.write(Object) 也不同。如果不指定协议的编解码器,你将收到一个类型为IoBuffer 的对象,返回的数据也要求是IoBuffer。
sessionIdle方法:空闲状态时,将定时调用一次会话
还有以下几个方法重写 @Override public void messageSent(IoSession arg0, Object message) throws Exception { // TODO Auto-generated method stub System.out.println("client发送信息"+message.toString()); }@Override
public void sessionClosed(IoSession session) throws Exception { // TODO Auto-generated method stub System.out.println("client与:"+session.getRemoteAddress().toString()+"断开连接"); }@Override
public void sessionCreated(IoSession session) throws Exception { // TODO Auto-generated method stub System.out.println("client与:"+session.getRemoteAddress().toString()+"建立连接"); }@Override
public void sessionOpened(IoSession arg0) throws Exception { // TODO Auto-generated method stub System.out.println("打开连接"); } (2)Mina客户端创建1.创建客户端连接对象IoConnector connector=new NioSocketConnector();或者NioSocketConnector connector = new NioSocketConnector();2.设置过滤器职责链(日志,编解码【多种编解码器】)
connector.getFilterChain().addLast("logger",new LoggingFilter());connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));也可以使用ioAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));3.设置Handler处理
connector.setHandler(new TimeClientHandler());4.建立Connect连接
ConnectFuture connectFuture=connector.connect(new InetSocketAddress("127.0.0.1",BaseConfig.PORT));connectFuture.awaitUninterruptibly();5.获得Session回话
IoSession session=connectFuture.getSession();6.输入输出操作
以下是接收控制台的输入,获得后发送到服务端Scanner sc = new Scanner(System.in);boolean quit = false;
while(!quit){
String str = sc.next();
if(str.equalsIgnoreCase("quit")){ quit = true; } session.write(str); }7.关闭Session和连接器
if(session!=null){ if(session.isConnected()){ session.getCloseFuture().awaitUninterruptibly(); } connector.dispose(true); }IoConnector connector = new NioSocketConnector(); connector.getFilterChain().addLast( "logger", new LoggingFilter() ); connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new PrefixedStringCodecFactory(Charset.forName("UTF-8")))); connector.setHandler(new TimeClientHander()); ConnectFuture connectFuture = connector.connect(new InetSocketAddress("127.0.0.1",BaseConfig.PORT)); //等待建立连接 connectFuture.awaitUninterruptibly(); System.out.println("连接成功");IoSession session = connectFuture.getSession();
Scanner sc = new Scanner(System.in);
boolean quit = false;
while(!quit){
String str = sc.next();
if(str.equalsIgnoreCase("quit")){ quit = true; } session.write(str); }//关闭
if(session!=null){ if(session.isConnected()){ session.getCloseFuture().awaitUninterruptibly(); } connector.dispose(true); }三、粘包分包处理
有三种常用方法可以将字节流分离成消息:使用固定长度的消息。使用固定长度的标头指出消息内容主体的长度。使用分隔符;例如很多基于文本的消息在消息的后面追加换行(或者CR LF组合) ()参考:
http://www.cnblogs.com/itfly8/p/5844911.html