Mina 之 Mina的异步机制

将mina异步机制之前,先了解下同步和异步的区别:

(1)同步:发送一个请求,等待返回,再下一步发送请求;简单的说,A告诉B去做某件事情,然后就一直等待,直到B做完后返回给A,A才继续做其它的事情;

(2)异步:发送一个请求,不用等待返回,可随时发送请求;简单的说:A告诉B做某件事情,然后就去干其它的事情了,B做完后再通知A。

 

Mina是一个非常流行的网络程序的框架,它提供的是异步的API(It provides an abstract • event-driven • asynchronous API)。

比如,如果client想要创建一个到server的连接,用mina可以这样写:

 

NioSocketConnector connector = new NioSocketConnector();  
// 初始化connector...  
//..........  
connector.connect(address);  

 看上去好像和一般的写法没什么两样。但是,这里的connector.connect()方法是一个异步的调用,意思是程序告诉mina要去连接 address,mina返回说它会做这件事,但它可能还没有做完。所以,即便“connector.connect(address);”这行代码结束 了,也并不意味着连接成功了(mina这时候可能还正在创建连接的过程中)。完整的写法应该是:

ConnectFuture connFuture = connector.connect(address);
connFuture.addListener(new ConnectListener(){ //回调方法
		private class ConnectListener implements IoFutureListener<ConnectFuture>{
			
			public void operationComplete(ConnectFuture future) {
				
				if (future.isConnected()) {
					//get session
					IoSession session = future.getSession();
					
					session.write(...);
					
				} else {
					
					logger.error("can not create the connection .");
				}
			}
		}
	}
}

 

 这里面最重要的一个类是ConnectListener,它实现了IoFutureListener<ConnectFuture>这个接 口。这个类其实只有一个函数 – operationComplete,这是一个回调函数,它告诉mina一旦connect完成以后,就调用这个函数。我们这里的回调函数,首先判断一下 连接是否成功,如果成功,那么就向这个链接中写入数据(session.write)。

 

 

回调函数在异步机制中扮演着非常重要的角色。 因为在同步机制中,调用者会等到结果返回然后自己执行接下来的操作,比如,上面这段代码如果写成同步的,大概是这个样子:

 

boolean status = connector.connect(address);
if(status) {
	session.write(...);
} else {
	logger.error("can not create the connection .");
}

 但是在异步机制中,就只能将connect后面的代码做成回调函数,注册到mina中。这样,当mina完成工作后它才知道接下去该干什么。

值得一提的是,虽然Mina号称是Asynchronous API,但它也提供了同步的方法。比如,上面这段代码,如果用Mina的同步机制是这样写的:

ConnectFuture future = connector.connect(address);
future.awaitUninterruptibly(); //阻塞主线程
IoSession session = future.getSession();
// Send the first ping message
session.write(....);

 重点在于“future.awaitUninterruptibly();”这行代码,它会将程序阻塞住,直到连接创建好,所以,当这行代码结束后,就可以直接获取session并执行write操作。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值