MINA入门使用

MINA作为高效能的可应对高并发访问的NIO框架,特性就不多介绍了。下面提供一些使用的实例。

服务器端代码:

/**
 * Description 用来启动MINA服务端
 * @author Administrator
 * 2012-10-21
 */
public class MinaTimeServer {
	protected static Logger logger = LoggerFactory.getLogger(MinaTimeServer.class);  
	private static final int PORT = 9123;											// 定义监听端口

	public static void main(String[] args) throws IOException {
		//监听客户端的连接
		IoAcceptor acceptor = new NioSocketAcceptor();
		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
		acceptor.getFilterChain().addLast(
				"codec",
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset
						.forName("GBK"))));										// 指定编码过滤器
		acceptor.setHandler(new TimeServerHandler());								// 指定业务逻辑处理器
		// 在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,
		// 则使用设置的线程池产生线程进行业务逻辑处理,
		acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
		acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));               // 设置端口号
		acceptor.bind();                                                            // 启动监听
	}
}

 服务器端程序的业务处理器:

/**
 * Description 业务逻辑处理器TimeServerHandler,继承自IoHandlerAdapter,
 * 实现的功能有:当客户端创建会话时会显示客户端设备的IP和端口;当客户端输入quit时结束会话;客户端输入其它内容时则向客户端发送当前时间。
 * @author Administrator
 * 2012-10-21
 */
public class TimeServerHandler extends IoHandlerAdapter {
	
	@Override
	public void sessionCreated(IoSession session) {
		//显示客户端的ip和端口
		System.out.println("Client IP:" + session.getRemoteAddress().toString());
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		String str = message.toString();
		if (str.trim().equalsIgnoreCase("quit")) {
			//结束会话,断开连接
			session.close(true);
			return;
		}
		
		Date date = new Date();
		session.write("Server return to client: " + date.toString());															//返回当前时间的字符串 
		System.out.println("Message written..." + str);
	}
}

这时可以进行测试前面的代码,用命令行中输入:

telnet 127.0.0.1 9123

服务器端会收到客户端的连接信息,显示:

Client IP:/127.0.0.1:3815

然后在telent窗口中输入字符:test123

服务器端会打印:Message written...test123

客户端显示服务器端返回的信息:Server return to client: Sun Oct 21 17:22:09 CST 2012

可看出MINA的客户端和服务器端可以相互进行通信。
下面是MINA客户端的连接类代码:
/**
 * Description MinaTimeClient类用于连接服务端,并向服务端发送消息
 * @author Administrator 
 * 2012-10-21
 */
public class MinaTimeClient {

	public static void main(String[] args) {
		// 与服务端建立连接
		NioSocketConnector connector = new NioSocketConnector();
		connector.getFilterChain().addLast("logger", new LoggingFilter());
		connector.getFilterChain().addLast(
				"codec",
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset
						.forName("UTF-8")))); 						// 设置编码过滤器
		connector.setConnectTimeout(30);
		connector.setHandler(new TimeClientHandler());					// 设置事件处理器
		ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1",
				9123));											// 建立连接
		cf.awaitUninterruptibly();										// 等待连接创建完成
		cf.getSession().write("hello");									// 发送消息
		cf.getSession().write("quit");									// 发送消息
		cf.getSession().getCloseFuture().awaitUninterruptibly();		// 等待连接断开
		connector.dispose();
	}
}
 客户端连接类用到的处理器代码:
/**
 * Description TimeClientHandler处理消息接收事件
 * @author Administrator 
 * 2012-10-21
 */
public class TimeClientHandler extends IoHandlerAdapter {

	public TimeClientHandler() {
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		System.out.println("Client received message:" + message);													// 显示接收到的消息
	}
}
  启动程序测试:
开始->运行->cmd->tecnet 127.0.0.1 9123
通过JDK自带工具jvisualvm查看线程:

 可看到几个线程:
NioSocketAcceptor-1为服务器端监听端口9999通过线程池创建的一个线程。
NioProcessor-2为IoProcessor线程池创建的线程,用来IO处理。
pool-3-thread-3为过滤器配置的线程池创建的线程,用来业务逻辑处理。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值