网络长链接框架之MINA初体验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010898329/article/details/68992511

项目进行中使用到了长链接方面的知识,在广大的网友的帮助下,果断选择使用MINA框架,对于一个菜鸟而言怎么开始呢?于是乎,搜到了郭大婶(郭霖)的一个视频,《见证Android消息推送时刻》,不得不说郭大婶出品的东西对于我等菜鸟而言确实比较好用,这里为了避免推广嫌疑,大家可以自行搜索,就不贴地址了,在视频中,郭神把MINA的使用讲得还是比较深入的,我这里纯属做笔记总结消化一下,也做一些自己的补充。

好了,下面开始正文,首先看一张图,这个是我自己总结的MINA服务端和客户端编写的代码时候应该遵循的步骤,其实搞懂了就非常简单,画个图也是为了便于去理解:


下面我们就按照图中所列出的步骤来编程,编程之前首先需要下载MINA相关的jar包,下载地址

http://mina.apache.org/downloads-mina.html



注意:下载zip包就可以了,然后进行解压,找到mina-core-2.0.16.jar 和 slf4j-api-1.7.21.jar 两个jar包,等会儿分别添加到客户端和服务器端的project中去


一 . MINA服务端编程

public class MinaServer {
	
	public static void main(String[] args) {
		try {
			// 第一步,新建一个accepter对象
			NioSocketAcceptor acceptor = new NioSocketAcceptor();
			// 第二步骤,设置Handler
			acceptor.setHandler(new MinaServerHandler());
			// 第三步,设置拦截器,设置成自带的拦截器
			acceptor.getFilterChain().addLast("mina", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("utf-8"))));
			// 第四步,创建端口连接
			acceptor.bind(new InetSocketAddress(9999));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

遵循图中列举的四步来实现客户端编程 , 下面贴出服务器端消息处理的Handler写法

/**
 * Mina框架中消息处理的Handler
 * @author CJT
 *
 */
public class MinaServerHandler extends IoHandlerAdapter {

	@Override
	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		System.out.println("MinaServerHandler---exceptionCaught");
	}

	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		System.out.println("MinaServerHandler---messageReceived"+message.toString());
		
		// 向客户端回复消息
		session.write("server replay--"+message);
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("MinaServerHandler---messageSent:"+message.toString());
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("MinaServerHandler---sessionClosed");
	}

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("MinaServerHandler---sessionCreated");
	}

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

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("MinaServerHandler---sessionOpened");
	}
	
}

基本上都是打印输出,没有做什么操作,唯独在标红的部分,当收到客户端的消息的时候,立马就给客户端回复一条消息。

// 向客户端回复消息
session.write("server replay--"+message);

二. MINA客户端编程

下面来看下客户端的实现代码

public class MinaClinet {
	
	public static void main(String[] args) {
		// 第一步,建立一个connecter
		NioSocketConnector connecter = new NioSocketConnector();
		
		// 第二步,设置消息处理的Handler
		connecter.setHandler(new MinaClinetHandler());
		
		// 第三步骤,设置过滤器
		connecter.getFilterChain().addLast("minaClinet", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("utf-8"))));
		
		// 第四步骤,连接服务器
		ConnectFuture future = connecter.connect(new InetSocketAddress("127.0.0.1",9999));
		// 阻塞等待连接创建
		future.awaitUninterruptibly();

		BufferedReader inputReader = null ;
		try {
			inputReader = new BufferedReader(new InputStreamReader(System.in, "utf-8")); // 从控制台读取的输入内容
			String s ;
			while (!(s = inputReader.readLine()).equals("exit")) {
				sendMsg(future.getSession(), "消息测试--"+s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} 		
		
	}
	
	public static void sendMsg(IoSession session , String msg){
		if(session != null){
			session.write(msg);
		}
	}
}

也是按照图中的描述的步骤来编程,不过第四步会一直阻塞直到和服务器连接成功,在ConnectFuture中可以拿到IoSession对象,然后通过IoSession来向服务器发送消息

// 第四步骤,连接服务器
ConnectFuture future = connecter.connect(new InetSocketAddress("127.0.0.1",9999));
// 阻塞等待连接创建
future.awaitUninterruptibly();

为了做模拟,我这里单独写了一个方法,sendMsg(IoSession session , String msg),通过拿到的session和接收从键盘的输入来不断的向服务器发送消息。


三. 演示效果

来看下效果,我这里使用了两个IDE,一个Eclipse跑客户端,一个MyEclipse跑服务端,当然,你也可以都在一个IDE中去跑,就是客户端和服务端都在一个Eclipse中运行。



源码就暂时不上传了,直接拷贝下上面的代码估计就可以用了,我也只是提供参考的思路,如果有需要的可以留言,我会上传的。




猜你喜欢

转载自blog.csdn.net/u010898329/article/details/68992511