Mina是NIO实现的一个架构,可以通过它快速开发网络通信,中间件等服务端程序。
IOService接口:描述服务端和客户端接口,子类是connector和Acceptor分别用于描述客户端和服务端。
IOproceser 多线程环境来处理我们的连接请求流程,ioFilter提供数据的过滤工作,包括编解码,日志等信息过滤。
Handler就是我们的业务对象,自定义Handler需实现IOHandlerAcceptor。
IOsession描述的是客户端和服务端连接的描述,常用于描述发送和接收数据。
总结:客户端流程 IOconnector->IOProcessor->IOFilter->Handler
服务端流程 IOAcceptor->IOProcessor->IOFilter->Handler
server端:
package com.zjl.demo.mina;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MinaServer {
public void init( ) thows Exception {
SocketAcceptor acceptor = new NioSocketAcceptor(Runtime.getRuntime( ).availableProcessors( ) +1);
DefaultIofilterChainBuilder chain = acceptor.getFilterChain( );
chain.addLast("codec",new ProtocolCodecFilter(
new TextLineCodecFactory( )));
acceptor.setHandler(new MinaServerHandler( ) );
acceptor.bind(new InetSocketAddress(8300));
System.out.printIn("绑定端口8300");
}
public MinaServer( ) throws Exception {
init( );
}
public static void main(String[ ] args) throws Exception {
new MinaServer( );
System.out.printIn(Mina服务器开启“);
}
}
服务端消息处理类:
package com.zjl.demo.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
public class MinaServerHanlder extens IoHandlerAdapter {
@Override
public void messageReceived(IoSession session, Object message)
thows Exception {
session.write("服务端发送消息”+message);
session.write("quite");
}
@Override
public void exceptionCaught (IoSession session,Throwable cause)
throws Exception {
if(session.isConnected( )) {
session.close(true);
}
}
@Override
public void exceptionCaught(IoSession session,Throwable cause)
throws Exception {
if(session.isConnected) {
session.close(true);
}
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.printIn("服务端收到消息“ + message.toString( ));
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosded(session);
System.out.printIn("sessionCLosed");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
session.getConfig( ).setIdleTime(IdleStatus.BOTH_IDLE,30000);
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
session.close(true);
}
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
}
}