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)); }}
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(); }}
package net.javasight.mina;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.core.service.IoConnector;import org.apache.mina.core.session.IoSession;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.NioSocketConnector;/** * @author javasight */public class MinaClient { private static final int PORT = 1234; public static void main(String[] args) throws IOException, InterruptedException { IoConnector connector = new NioSocketConnector(); connector.getSessionConfig().setReadBufferSize(2048); connector.getFilterChain().addLast("logger", new LoggingFilter()); connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset .forName("UTF-8")))); connector.setHandler(new MinaClientHandler("Hello Server..")); ConnectFuture future = connector.connect(new InetSocketAddress( "172.108.0.12", PORT)); future.awaitUninterruptibly(); if (!future.isConnected()) { return; } IoSession session = future.getSession(); session.getConfig().setUseReadOperation(true); session.getCloseFuture().awaitUninterruptibly(); System.out.println("After Writing"); connector.dispose(); }}
package net.javasight.mina;import org.apache.log4j.Logger;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;/** * @author giftsam */public class MinaClientHandler extends IoHandlerAdapter { private final Logger logger = Logger.getLogger(getClass()); private final String values; private boolean finished; public MinaClientHandler(String values) { this.values = values; } public boolean isFinished() { return finished; } @Override public void sessionOpened(IoSession session) { session.write(values); } @Override public void messageReceived(IoSession session, Object message) { logger.info("Message received in the client.."); logger.info("Message is: " + message.toString()); } @Override public void exceptionCaught(IoSession session, Throwable cause) { session.close(); }}
4412 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CREATED4412 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - OPENED4449 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - RECEIVED: HeapBuffer[pos=0 lim=15 cap=2048: 48 65 6C 6C 6F 20 53 65 72 76 65 72 2E 2E 0A]0 [NioProcessor-2] INFO net.javasight.mina.MinaServerHandler - Message received in the server..1 [NioProcessor-2] INFO net.javasight.mina.MinaServerHandler - Message is: Hello Server..14453 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - IDLE10001 [NioProcessor-2] INFO net.javasight.mina.MinaServerHandler - Disconnecting the idle.14457 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CLOSED
297 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CREATED297 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - OPENED325 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]10334 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CLOSEDAfter Writing