昨天我们讲到了Mina的基本知识点。如果还有不懂得同学可以看一下我昨天的博客。http://www.cnblogs.com/getherBlog/p/3934927.html今天我着重来讲一下基于Mina的客户端的开发(代码均在最后链接地址中,欢迎下载)。
一、首先看一下,我的客户端的代码图片:
客户端代码我是在Eclipse下写的。
二、客户端的整体思路:
-
- 首先,产生一个socket连接对象,用于连接到服务器;
- 然后,对这个连接添加我们的I/O过滤器(SSL加密、日志过滤器、编码过滤器等,这里注意,如果添加SSL过滤器,那么一定要第一个添加,否则无法对数据加密);
- 接下来,为连接设置I/O处理器,顾名思义就是处理接收到的消息(这里我们只能设置一个处理器,如果有设置多个,那么默认进入到最后一个I/O处理器中进行处理);
- 最后,连接到通过IP和端口号连接到服务器;保存连接的获取到的session,如果需要发送消息,我们就可以对session进行操作。
三、正式编码
这里我展示几个比较重要的类来详细说明一下:
-
-
-
MinaClient.Java
View Code
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; } }
-
MinaClient.Java
-