Java NIO框架Mina

原创
2014/04/10 16:49
阅读数 1.7K

真羡慕java有系列的懒人框架,虽然c也有Netty, ACE等高速网络框架,但是语言的特性,决定了java框架之间更好集成,更加廉价。

上一个我的测试代码:

/**
 * 
 */
package com.jinbao.MinaDemo;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandlerAdapter;
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.transport.socket.nio.NioSocketAcceptor;

/**
 * @author zhuji06
 *
 */
public class MinaService extends IoHandlerAdapter {
	
	//有消息到达时会调用此方法
	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {

	    System.out.println("Server Received : " + message);
	    session.write("Im Server [" + System.currentTimeMillis() + "]");
	}



	//有消息即发送出去时会调用此方法
	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
	    System.out.println("Server Sent : " + message);
	}



	public static void main(String[] args) throws IOException {

	   //1 创建服务端借口实例,服务端就是acceptor(貌似MINA3会改)
	    IoAcceptor acceptor = new NioSocketAcceptor();

	    //2 设置IoHandler,handler是处于上层的其直接对应逻辑处理
	    acceptor.setHandler(new MinaService());

	    //3 添加消息过滤器
	    acceptor.getFilterChain().addLast("decode", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));

	    //4 设置session缓存大小

	    //5 设置连接空闲时间单位秒

	    //6 开始监听
	    acceptor.bind(new InetSocketAddress("localhost", 9696));

	}
}

客户端:

/**
 * 
 */
package com.jinbao.MinaDemo;

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.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
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.transport.socket.nio.NioSocketConnector;

/**
 * @author zhuji06
 *
 */
public class MinaClient extends IoHandlerAdapter {

    public static boolean received = false;

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {

		System.out.println("Client Received : " + message);
		received = true;
    }

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {

        System.out.println("Client Sent : " + message);
    }



    public static void main(String[] args) {

        //1 客户端实例对应的接口是IoConnector
        IoConnector connector = new NioSocketConnector();

        //2 handler
        IoHandler handler = new MinaClient();

        connector.setHandler(handler);

        //3 添加消息过滤器
        connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));

        //4 开始连接服务器端
        //这里和服务器端编码有所不同,由于MINA采用非阻塞模式,
        //所以客户端连接服务端是非阻塞的,即connect()方法调用后执行线程会立即执行下面的代码。
        //但connect()会返回一个ConnectFuture对象,使用它可以判断是否已经建立连接
        ConnectFuture future = connector.connect(new InetSocketAddress("localhost", 9696));

        //5 等待直到连接建立
        future.awaitUninterruptibly();

        //6 得到session
        IoSession session = future.getSession();

        //7 session.write()将一个对象发送出去,至于对象如何变成二进制那是编码解码器干的事情,后面会介绍的
        session.write("Hello! i`m Client");

        //等待服务器回馈的消息
        while (!received) {

            //消息还没来我就一直睡!睡啊睡!
            try {

                Thread.sleep(2);
                
            } catch (InterruptedException e) {
                e.printStackTrace();

            }

        }

        //8 关闭客户端连接
        connector.dispose(true);

    }

}


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
12 收藏
0
分享
返回顶部
顶部