zoukankan      html  css  js  c++  java
  • JAVA通信系列二:mina入门总结

    一、学习资料

    Mina入门实例(一)
    http://www.cnblogs.com/juepei/p/3939119.html

    Mina入门教程(二)----Spring4 集成Mina
    http://www.cnblogs.com/juepei/p/3940396.html

    Apache Mina 入门实例——创建一个MINA时间服务
    http://loftor.com/archives/apache-mina-quick-start-guide.html


    MINA2.0用户手册中文版——系列文档
    http://blog.csdn.net/lxlzhn/article/category/1272213/2

    mina 心跳机制
    出处:http://wandejun1012.iteye.com/blog/2065941

    mina框架详解
    http://www.cnblogs.com/gw811/p/4279230.html

    mina编码器详解
    http://wenku.baidu.com/link?url=Pk11Evhi-8NEVx6WCaxzRQJA1yjumNxBjWTS5s2NENHjE1sX16ljnJNv-7mkas5z4rIHrOTgu5Dx-dGdFDnZk-i2W4vMLfbssAy1nrd33AK

    Mina系列文章索引(解码解析等,不错)
    http://my.oschina.net/ielts0909/blog/92716

    二、代码示例
    (1)Mina服务端创建步骤
    1.建立监听对象
    IoAcceptor acceptor=new NioSocketAcceptor();
    2.添加Filter(日志,编解码)
    acceptor.getFilterChain().addLast("logger",new LoggingFilter());
    acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));

    3.添加Handler处理
    acceptor.setHandler(new TimeServerHandler());

    4.设置回话参数【输入缓存区Buffer大小,多久进入空闲时间】
    acceptor.getSessionConfig.setReadBufferSize(2048);
    acceptor.getessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);

    5.绑定端口号,开始监听
    acceptor.bind(new InetSocketAddress(PORT));

    Handler处理类开发
    继承IOHandler类或者实现IoHandler接口
    客户端Handler,服务端Handler使用同一个IOHandler继承实现。
    public TimeServerHandler extends IoHandlerAdapter
    {
    @Override
    public void exceptionCaught(IoSession session,Throwable cause) throws Exception
    {
    cause.printStackTrace();
    }

    @Override
    public void messageReceived(IoSession session,Object message) throws Exception
    {
    String str=message.toString();
    if(str.trim().equalsIgnoreCase("quit"))
    {
    session.close();
    return ;
    }

    Date date=new Date();
    session.write(date.toString());
    System.out.println("Message written...");
    }

    @Override
    public void sessionIdle(IoSession session,IdleStatus status) throws Exception
    {
    System.out.println("IDLE"+session.getIdleCount(status));
    }
    }

    exceptionCaught方法:捕获错误,简单地打印了错误的堆栈跟踪和关闭会话。

    messageReceived方法:来处理从客户端接收到的数据,这里是将当前时间返回给客户端。根据所使用的协议编解码器,object 这个参数传递的类型有所不同,以及返回的数据时的session.write(Object) 也不同。如果不指定协议的编解码器,你将收到一个类型为IoBuffer 的对象,返回的数据也要求是IoBuffer。

    sessionIdle方法:空闲状态时,将定时调用一次会话
    还有以下几个方法重写
        @Override
        public void messageSent(IoSession arg0, Object message) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("client发送信息"+message.toString());
        }

        @Override
        public void sessionClosed(IoSession session) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("client与:"+session.getRemoteAddress().toString()+"断开连接");
        }

        @Override
        public void sessionCreated(IoSession session) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("client与:"+session.getRemoteAddress().toString()+"建立连接");
        }

        @Override
        public void sessionOpened(IoSession arg0) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("打开连接");
        }


    (2)Mina客户端创建
    1.创建客户端连接对象
    IoConnector connector=new NioSocketConnector();或者NioSocketConnector connector = new NioSocketConnector();

    2.设置过滤器职责链(日志,编解码【多种编解码器】)
    connector.getFilterChain().addLast("logger",new LoggingFilter());
    connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));
    也可以使用
    ioAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));

    3.设置Handler处理
    connector.setHandler(new TimeClientHandler());

    4.建立Connect连接
    ConnectFuture connectFuture=connector.connect(new InetSocketAddress("127.0.0.1",BaseConfig.PORT));
    connectFuture.awaitUninterruptibly();

    5.获得Session回话
    IoSession session=connectFuture.getSession();

    6.输入输出操作
    以下是接收控制台的输入,获得后发送到服务端
    Scanner sc = new Scanner(System.in);

            boolean quit = false;

            while(!quit){

                String str = sc.next();
                if(str.equalsIgnoreCase("quit")){
                    quit = true;
                }
                session.write(str);
            }

    7.关闭Session和连接器
            if(session!=null){
                if(session.isConnected()){
                    session.getCloseFuture().awaitUninterruptibly();
                }
                connector.dispose(true);
            }
    IoConnector connector = new NioSocketConnector();
            connector.getFilterChain().addLast( "logger", new LoggingFilter() );
            connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));
            connector.setHandler(new TimeClientHander());
            ConnectFuture connectFuture = connector.connect(new InetSocketAddress("127.0.0.1",BaseConfig.PORT));
            //等待建立连接
            connectFuture.awaitUninterruptibly();
            System.out.println("连接成功");

            IoSession session = connectFuture.getSession();

            Scanner sc = new Scanner(System.in);

            boolean quit = false;

            while(!quit){

                String str = sc.next();
                if(str.equalsIgnoreCase("quit")){
                    quit = true;
                }
                session.write(str);
            }

            //关闭
            if(session!=null){
                if(session.isConnected()){
                    session.getCloseFuture().awaitUninterruptibly();
                }
                connector.dispose(true);
            }

    三、粘包分包处理
    有三种常用方法可以将字节流分离成消息:
    使用固定长度的消息。
    使用固定长度的标头指出消息内容主体的长度。
    使用分隔符;例如很多基于文本的消息在消息的后面追加换行(或者CR LF组合)   (http://www.faqs.org/rfcs/rfc977.html)

  • 相关阅读:
    3种方法实现CSS隐藏滚动条并可以滚动内容
    javascript 计算两个整数的百分比值
    使用watch监听路由变化和watch监听对象的实例
    springboot全局捕获异常
    使用 Java 创建聊天客户端-2
    使用 Java 创建聊天客户端-1
    使用 ServerSocket 建立聊天服务器-2
    使用 ServerSocket 建立聊天服务器-1
    ServerSocket
    scheduled定时任务+实例请求数据库
  • 原文地址:https://www.cnblogs.com/itfly8/p/5844911.html
Copyright © 2011-2022 走看看