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 常量值后再次编译并启动。
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 不仅仅是用来开发网络服务器端应用程序,它一样可以使用 IoConnector 来连接到各种各样的网络服务程序。
通过本文中 HelloServer 这个例子,我们在惊叹 MINA 可以带来多么大便利的同时,还不得不为其卓越的性能而骄傲,据称使用MINA开发服务器程序的性能已经逼近使用 C/C++ 语言开发的网络服务。作为 MINA 的入门文章,性能问题不在本文讨论范围内。
另外在 MINA 压缩包中附带有不少比 HelloServer 要好得多的例子,通过这些例子可以进一步的了解并掌握 MINA。