作为一个比较优秀的网络通信框架,MINA框架大大的方便了我们开发高性能、高扩展性应用程序的效率,他的底层实现是java NIO,众所周知NIO是同步非阻塞式IO,使用它我们可以开发高并发的java程序,但是使用起来过于复杂也让人望而却步,MINA对NIO进行了二次封装,使用起来还是比较简单的,因为项目中用到了他来实现长连接心跳检测,所以决定研究下他的源码,更关键的是他优秀的线程模型和责任链机制,好了,我们先从一个实例开始说起;
首先先看服务端:
使用MINA步骤:
(1):创建一个NioSocketAcceptor对象;
(2):为NioSocketAcceptor对象添加Filter对象,这个Filter可以认为是二进制数据与对象之间的转换器,可以设置多个,可以使用框架自带的,我们也可以自己写,在这里我们使用框架自带的;
(3):创建一个继承自IoHandlerAdapter的业务逻辑处理类MinaServerHandler,并且重写IoHandlerAdapter里面的方法,我们这个示例中将仅仅是打印一些输出信息;
(4):将MinaServerHandler对象设置到NioSocketAcceptor对象上面;
(5):为当前NioSocketAcceptor绑定IP以及端口号;
MinaServer.java
public class MinaServer {
public static void main(String[] args) {
MinaServer server = new MinaServer();
server.initServer(9898);
}
public void initServer(int port)
{
NioSocketAcceptor acceptor = new NioSocketAcceptor();
MinaServerHandler handler = new MinaServerHandler();
try {
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
acceptor.setHandler(handler);
acceptor.bind(new InetSocketAddress(port));
} catch (IOException e) {
e.printStackTrace();
}
}
}
MinaServerHandler.java
public class MinaServerHandler extends IoHandlerAdapter{
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
System.out.println("exceptionCaught");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String receiverContent = (String)message;
System.out.println("server messageReceived: "+receiverContent);
session.write("Server has received message");
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("messageSent");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("sessionClosed");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("sessionIdle");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
}
}
接着查看客户端 使用MINA步骤:
(1):创建一个NioSocketConnector对象;
(2):为NioSocketConnector对象添加Filter对象,这个Filter可以认为是二进制数据与对象之间的转换器,可以设置多个,可以使用框架自带的,我们也可以自己写,在这里我们使用框架自带的;
(3):创建一个继承自IoHandlerAdapter的业务逻辑处理类MinaClientHandler,并且重写IoHandlerAdapter里面的方法,我们这个示例中将仅仅是打印一些输出信息;
(4):创建连接,为NioSocketConnector绑定IP和端口号,同时我们要获得connect的返回值,并且调用返回值的awaitUninterruptibly方法,因为我们后面需要用到该连接的IoSession对象,而NIO是非阻塞式的,没法保证我们后面用到的IoSession是否已经存在;
(5):通过ConnectFuture的getSession方法,获得当前连接的IoSession对象,接着我们便可以使用该对象进行一系列操作了;
MinaClient.java
public class MinaClient {
public static void main(String[] args) {
MinaClient client = new MinaClient();
client.initClient("127.0.0.1", 9898);
}
public void initClient(String host,int port)
{
NioSocketConnector connector = new NioSocketConnector();
MinaClientHandler handler = new MinaClientHandler();
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
connector.setHandler(handler);
ConnectFuture future = connector.connect(new InetSocketAddress(host,port));//创建连接
future.awaitUninterruptibly();//阻塞直到连接建立,因为我们后面要使用连接成功之后创建的Session对象来进行写数据的操作
IoSession session = future.getSession();//获得Session对象
session.write("hello world");
}
}
MinaClientHandler.java
public class MinaClientHandler extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
System.out.println("exceptionCaught");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String receiverContent = (String)message;
System.out.println(receiverContent);
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("messageSent");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("sessionClosed");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("sessionIdle");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
}
}
在测试中,客户端向服务端发送了"hello world",服务端在收到之后将消息输出到控制台,同时向客户端回送了"Server has received message",接着我们分别运行服务端和客户端,可以看到下面输出信息:
服务端:
客户端:
以上就是MINA的基本用法了,在下一篇博客我将带大家看看MINA的源码,这篇先写到这里啦!