首页 > 代码库 > Mina 第一个mina程序(一)

Mina 第一个mina程序(一)

引入两个jar包 :

mina-core-2.0.3.jar

slf4j-api-1.6.0.jar

 

服务端编写 : Server和handler

Server:

public class MyServer {

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

        // 初始化了服务端的TCP/IP 的基于NIO 的套接字
        //IoAcceptor的抽象是IoServivce :服务端
        IoAcceptor acceptor = new NioSocketAcceptor();
        // 调用IoSessionConfig设置读取数据的缓冲区大小
        acceptor.getSessionConfig().setReadBufferSize(2048);
        // 读写通道均在10 秒内无任何操作就进入空闲状态
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

        // 在bind前执行的准备工作
        // TextLineCodecFactory 编解码器工厂来对字符串进行编解码处理。
        acceptor.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
                        LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));

        acceptor.setHandler(new MyIoHandler());

        acceptor.bind(new InetSocketAddress(9123));

    }
}

handler :

public class MyIoHandler extends IoHandlerAdapter{
    
    // 这里我们使用的SLF4J作为日志门面,至于为什么在后面说明。
    private final static Logger log = LoggerFactory.getLogger(MyIoHandler.class);
    
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        String str = message.toString();
        //简单打印客户端传过来的数据
        System.out.println("The message received is [" + str + "]");
        if (str.endsWith("quit")) {
            session.close(true);
            return;
        }
    }
    
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        System.out.println("session create");
    }
    
    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("session closed");
    }
    
}

 

客户端编写 :client 和handler

client:

public class MyClient {
    
    //编写IoService并注册过滤器
    public static void main(String[] args) {
        
        //IoConnector的抽象是IoServivce:客户端
        IoConnector connector = new NioSocketConnector();
        connector.setConnectTimeoutMillis(30000);
        connector.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
                        LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));
        
        //为IoService注册Handler
        connector.setHandler(new ClientHandler("你好!\r\n 大家好!"));
        
        connector.connect(new InetSocketAddress("localhost", 9123));
            
        
    }
}

handler:

public class ClientHandler extends IoHandlerAdapter{

    private final static Logger LOGGER = LoggerFactory.getLogger(ClientHandler.class);
    
    private final String values;

    public ClientHandler(String values) {
        this.values = values;
    }
    
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        session.write(values);
    }
    
}

 

 

mina重要对象介绍 :

IoService对象

        //IoService的常用方法
        //获取传输方式的元数据描述信息,也就是底层到底基于什么的实现,譬如:nio、apr 等。
        TransportMetadata transportMetadata =http://www.mamicode.com/ connector.getTransportMetadata();
        //增加删除一个监听器:监听IoService 的创建、活动、失效、空闲、销毁
        //参考IoServiceListener 接口中的方法,这为你参与IoService 的生命周期提供了机会
        connector.addListener(null);
        connector.removeListener(null);
        //获取IoService上管理的所有IoSession,Map的key是IoSession的id
        Map<Long ,IoSession> maps = connector.getManagedSessions();
        //获取IoSession的配置对象:读数据的缓存大小,多少秒进入空闲状态
        connector.getSessionConfig();
        
        //1.IoAcceptor 服务端的IoService 增加bind端口方法
        //2.IoConnector 客户端的IoService 增加connect与server建立连接
        

 IoSession对象

    //IoSession : 这个接口用于表示Server 端与Client 端的连接
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        
        //这个方法用于写数据,该操作是异步的。
        session.write(values);
        //关闭IoSession,该操作也是异步的,参数指定true 表示立即关闭,否则就在所有的写操作都flush 之后再关闭。
        session.close();
        //向会话中添加一些属性,这样可以在会话过程中都可以使用,
        //类似于HttpSession 的setAttrbute()方法。IoSession 内部使用同步的HashMap 存储你添加的自定义属性。
        session.setAttribute("设置属性");
        //获取远端连接的套接字地址
        session.getRemoteAddress();
        //用于挂起写操作,那么有void resumeWrite()方法与之配对。对于read()方法同样适用。
        session.suspendWrite();
        //用于读取数据, 但默认是不能使用的, 你需要调用IoSessionConfig 的
        //setUseReadOperation(true)才可以使用这个异步读取的方法。一般我们不会用到这个方法,
        //因为这个方法的内部实现是将数据保存到一个BlockingQueue,假如是Server 端,因为大
        //量的Client 端发送的数据在Server 端都这么读取,那么可能会导致内存泄漏,但对于
        //Client,可能有的时候会比较便利。
//        session.read();
        //返回与当前会话对象关联的IoService 实例
        session.getService();
        
    }

 

Mina 第一个mina程序(一)