构建一个TCP的时间服务器和客户端来了解构建基于MINA 的应用程序的步骤。
需要的最小jar 包:
日志是必须的,log4j.properties 配置为:
log4j.rootCategory= DEBUG, stdout
log4j.appender.stdout= org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout= org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [%d{HH\ : mm \: ss }] %t %p %X{name}
在服务器端:
创建一个接收器来监听连接请求:
NioSocketAcceptor acceptor = new NioSocketAcceptor();
构建过滤器链:
acceptor.getFilterChain().addLast( "logger" , new LoggingFilter());
acceptor.getFilterChain().addLast( "codec" , new ProtocolCodecFilter( new TextLineCodecFactory(Charset. forName ( "UTF-8" ))));
注:LoggerFilter 用来记录各种事件。协议编解码过滤器用编解码工厂初始化,用来在原始字节和高层对象之间进行编解码。这是使用的MINA自带的文本行解码器。
设置IoHandler :
acceptor.setHandler( new TimeServerHandler());
设置服务器的属性(如缓存大小等):
acceptor.getSessionConfig().setReadBufferSize(1024);
acceptor .getSessionConfig().setIdleTime(IdleStatus. BOTH_IDLE , 10);
把服务绑定到指定的端口上:
acceptor.bind( new InetSocketAddress(8985));
编写业务逻辑处理器IoHandler :
public class TimeServerHandler extends IoHandlerAdapter {
private Logger log = LoggerFactory. getLogger (TimeServerHandler. class );
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
log .info( "messageReceived" );
String str = message.toString();
if ( "quit" .equalsIgnoreCase(str.trim())) {
session.close( true );
return ;
}
Date date = new Date();
session.write(str + " : " + date.toString());
log .info( "message writter ..." );
}
}
注:用户可以自己选择覆盖其他的方法,以处理异常情况、连接空闲等事件。
用telnet 命令来测试时间服务器:
telnet 127.0.0.1 8985
在客户端:
创建连接器:
IoConnector connector = new NioSocketConnector();
创建过滤器链:
connector.getFilterChain().addLast( "logger" , new LoggingFilter());
connector .getFilterChain().addLast( "codec" , new ProtocolCodecFilter( new TextLineCodecFactory()));
设置处理器:
connector.setHandler( new ClientHandler());
连接到服务器:
ConnectFuture cf = connector.connect( new InetSocketAddress( "127.0.0.1" , 8985));
等待连接成功:
cf. awaitUninterruptibly ();
获取连接的会话:
IoSession session = cf.getSession();
向服务器写请求:
session.write( "abc" );
关闭连接:
session.close( false );
关闭连接器,释放资源:
connector.dispose();
业务处理器:
public class ClientHandler extends IoHandlerAdapter {
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String msg = (String) message;
System. out .println( "response :" + msg);
}
}