MINA框架源码分析(一)

        作为一个比较优秀的网络通信框架,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的源码,这篇先写到这里啦!

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值