简介: 本文将通过一个简单的问候程序 HelloServer 来介绍 MINA 的基础架构的同时演示如何使用 MINA 开发网络应用程序。
Netty 是JBoss旗下的io传输的框架,他利用java里面的nio来实现高效,稳定的io传输。
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。
目前正在使用 MINA 的软件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。
本文将通过一个简单的问候程序 HelloServer 来介绍 MINA 的基础架构的同时演示如何使用MINA 开发网络应用程序。
环境准备:
1.编写代码 HelloServer.java 如下
package demo.mina.echo; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.mina.common.*; import org.apache.mina.transport.socket.nio.*; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; /** * HelloServer演示程序 * @author liudong ( http://www.dlog.cn/javayou ) */ public class HelloServer { private static final int PORT = 8080; /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { IoAcceptor acceptor = new SocketAcceptor(); IoAcceptorConfig config = new SocketAcceptorConfig(); DefaultIoFilterChainBuilder chain = config.getFilterChain(); //使用字符串编码 chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory())); //启动HelloServer acceptor.bind(new InetSocketAddress(PORT), new HelloHandler(), config); System.out.println("HelloServer started on port " + PORT); } } /** * HelloServer的处理逻辑 * @author liudong */ class HelloHandler extends IoHandlerAdapter { /** * 当有异常发生时触发 */ @Override public void exceptionCaught(IoSession ssn, Throwable cause) { cause.printStackTrace(); ssn.close(); } /** * 有新连接时触发 */ @Override public void sessionOpened(IoSession ssn) throws Exception { System.out.println("session open for " + ssn.getRemoteAddress()); } /** * 连接被关闭时触发 */ @Override public void sessionClosed(IoSession ssn) throws Exception { System.out.println("session closed from " + ssn.getRemoteAddress()); } /** * 收到来自客户端的消息 */ public void messageReceived(IoSession ssn, Object msg) throws Exception { String ip = ssn.getRemoteAddress().toString(); System.out.println("===> Message From " + ip +" : " + msg); ssn.write("Hello " + msg); } }
先不用试着去读懂每一行代码的具体意思,用你顺手的编译器编译 HelloServer.java,如果报错请确认是否已将前面提到的三个 jar 文件添加至类路径中。如果一切顺利接着就可以启动HelloServer 程序,启动后提示:HelloServer started on port 8080
表示启动成功,如果启动失败,问题无外乎是类没找到或者端口占用。如果端口被占用的话,换一个罗,修改 PORT
常量值后再次编译并启动。
打开命令行窗口,输入 telnet localhost 8080 后,输入您的英文名或者其他一些乱七八糟的字符后回车再去看看刚启动的服务程序有何反应。我的反应如下:
HelloServer started on port 8080 session open for /127.0.0.1:3023 ===> Message From /127.0.0.1:3023 :hello ===> Message From /127.0.0.1:3023 :hello ===> Message From /127.0.0.1:3023 :liudong ===> Message From /127.0.0.1:3023 :Winter Lau
MINA
开发的网络程序已经成功运行了。
MINA 基本类的描述
在介绍架构之前先认识几个接口:
IoAccepter 相当于网络应用程序中的服务器端
IoConnector 相当于客户端
IoSession 当前客户端到服务器端的一个连接实例
IoHandler 业务处理逻辑
IoFilter 过滤器用于悬接通讯层接口与业务层接口
出自:http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/