昨天我们讲到了Mina的基本知识点。如果还有不懂得同学可以看一下我昨天的博客。http://www.cnblogs.com/getherBlog/p/3934927.html今天我着重来讲一下基于Mina的客户端的开发(代码均在最后链接地址中,欢迎下载)。

 

   一、首先看一下,我的客户端的代码图片:

       【Andorid开发框架学习】之Mina开发之客户端开发客户端代码我是在Eclipse下写的。

 

   二、客户端的整体思路:

      • 首先,产生一个socket连接对象,用于连接到服务器;
      • 然后,对这个连接添加我们的I/O过滤器(SSL加密、日志过滤器、编码过滤器等,这里注意,如果添加SSL过滤器,那么一定要第一个添加,否则无法对数据加密);
      • 接下来,为连接设置I/O处理器,顾名思义就是处理接收到的消息(这里我们只能设置一个处理器,如果有设置多个,那么默认进入到最后一个I/O处理器中进行处理);
      • 最后,连接到通过IP和端口号连接到服务器;保存连接的获取到的session,如果需要发送消息,我们就可以对session进行操作。

 

   三、正式编码

      这里我展示几个比较重要的类来详细说明一下:

      • MinaClient.Java
        package com.example.mina.server;
        
        import java.net.InetSocketAddress;
        
        import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
        import org.apache.mina.core.future.CloseFuture;
        import org.apache.mina.core.future.ConnectFuture;
        import org.apache.mina.core.session.IoSession;
        import org.apache.mina.filter.codec.ProtocolCodecFilter;
        import org.apache.mina.filter.logging.LoggingFilter;
        import org.apache.mina.filter.ssl.SslFilter;
        import org.apache.mina.transport.socket.SocketConnector;
        import org.apache.mina.transport.socket.nio.NioSocketConnector;
        
        import com.example.mina.charset.CharsetFactory;
        import com.example.mina.hanlder.MsgHanler;
        import com.example.mina.ssl.SSLContextGenerator;
        
        /**
         * <pre>
         * Project Name:MinaClient
         * Package:com.example.mina.server
         * FileName:MinaClient.java
         * Purpose:客户端
         * Create Time: 2014-8-19 下午4:36:55
         * Create Specification:
         * Modified Time:
         * Modified by:
         * Modified Specification:
         * Version: 1.0
         * </pre>
         * 
         * @author myp
         */
        public class MinaClient {
        
            private SocketConnector connector;
            private ConnectFuture future;
            private IoSession session;
        
            public boolean connect() {
                /*
                 * 1.创建一个socket连接,连接到服务器
                 */
                connector = new NioSocketConnector();
        
                /*
                 * 获取过滤器链,用于添加过滤器
                 */
                DefaultIoFilterChainBuilder chain = connector.getFilterChain();
        
                /*
                 * 2.为连接添加过滤器,SSL、日志、编码过滤器
                 */
                // SSLContextGenerator是我们自己写的一个SSL上下文产生器,稍后会讲到
                SslFilter sslFilter = new SslFilter(
                        new SSLContextGenerator().getSslContext());
                // 设置为客户端模式
                sslFilter.setUseClientMode(true);
                // a.ssl过滤器,这个一定要第一个添加,否则数据不会进行加密
                chain.addFirst("sslFilter", sslFilter);
        
                // b.添加日志过滤器
                chain.addLast("logger", new LoggingFilter());
        
                // c.添加字符的编码过滤器
                chain.addLast("codec", new ProtocolCodecFilter(new CharsetFactory()));
        
                /*
                 * 3.设置消息处理器,用于处理接收到的消息
                 */
                connector.setHandler(new MsgHanler());
        
                /*
                 * 4.根据IP和端口号连接到服务器
                 */
                future = connector.connect(new InetSocketAddress("192.168.1.12", 3456));
                // 等待连接创建完成
                future.awaitUninterruptibly();
        
                /*
                 * 5.获取session对象,通过session可以向服务器发送消息;
                 */
                session = future.getSession();
                session.getConfig().setUseReadOperation(true);
                return future.isConnected();
            }
        
            /**
             * 往服务器发送消息
             * 
             * @param message
             */
            public void sendMsg2Server(String message) {
                session.write(message);
            }
        
            /**
             * 关闭与服务器的连接
             * 
             * @return
             */
            public boolean close() {
                CloseFuture future = session.getCloseFuture();
                future.awaitUninterruptibly(1000);
                connector.dispose();
                return true;
            }
        }
        View Code

相关文章: