Apache Mina – 简单的客户端/服务端应用示例
转自http://javasight.net/2011/05/simple-client-server-application-using-mina/
Introduction介绍
Mina的缩写意思是”Multipurpose Infrastructure for Network Applications(多用途网络应用基础设施)”,它用于开发高度可扩展和高性能网络应用的网络应用框架。在本文中,让我们看看如何使用Apache Mina2.0.x来创建一个简单的客户端服务器端(c/s)应用。
所需的JAR包
Apache Mina 2.0.x jars
slf4j-api.jar
slf4k-jdk14.jar
服务端部分
对服务器端部分,我们需要使用MinaServer和MinaServerHandler两个类。MinaServer类包含了主方法和名为IoAcceptor的借口来接受来自客户端的进入连接,IoAcceptor用于向handler触发相应的事件。 我们使用了两个过滤器,第一个是LoggingFilter,用于记录所有的事件,第二个是ProtocolCOdecFilter,用于转换进入的ByteBuffer到报文的POJO。MinaServer的类代码如下:
MinaServer.java
package net.javasight.mina; /** * @author javasight */ import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaServer { private static final int PORT = 1234; public static void main(String[] args) throws IOException { IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset .forName("UTF-8")))); acceptor.setHandler(new MinaServerHandler()); acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); acceptor.bind(new InetSocketAddress(PORT)); } }
接着我们创建一个名为MinaServerHandler自定义handler,它包含了4个方法。第一个方法是sessionOpened在session打开后被调用, 它用于设置session的空闲时间。第二个方法是receiveMessage,用于接收由客户端发送的消息。 其他两个方法sessionIdle用于在session空闲10秒钟后关闭该session,第四个方法exceptionCaught用于在异常发生时关闭session。MinaServerHandler类的代码如下:
MinaServerHandler.java
package net.javasight.mina; import org.apache.log4j.Logger; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; /** * @author javasight */ public class MinaServerHandler extends IoHandlerAdapter { private final Logger logger = Logger.getLogger(getClass()); @Override public void sessionOpened(IoSession session) { // set idle time to 10 seconds session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); session.setAttribute("Values: "); } @Override public void messageReceived(IoSession session, Object message) { logger.info("Message received in the server.."); logger.info("Message is: " + message.toString()); } @Override public void sessionIdle(IoSession session, IdleStatus status) { logger.info("Disconnecting the idle."); // disconnect an idle client session.close(); } @Override public void exceptionCaught(IoSession session, Throwable cause) { // close the connection on exceptional situation session.close(); } }
客户端部分
对于客户端部分MinaClient和MinaClientHandler类被我们所使用。在MinaClient类中,IoConnector借口用于与服务器端进行交互并向handler中触发事件。 向服务端一样,同样的LoggingFilter、ProtocolCodecFilter也被使用了。名为ConnectFuture接口被用于