mina基础概念

概念

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP、UDP/IP 协议栈的通信框架,创建一个完整的基于 Apache MINA 的网络应用,需要分别构建这三个层次。

Apache MINA 已经为 IoService和 IoFilter 提供了不少的实现,因此这两个层次在大多数情况下可以使用已有的实现。IoProcessor由于是与具体的业务相关的,一般来说都是需要自己来实现的。 
Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步操作的编程模型。 事件驱动的 API 使得基于 Apache MINA 开发网络应用变得比较简单。应用不需要考虑与底层传输相关的具体细节,而只需要处理抽象的 I/O 事件。比如在实现一个服务端应用的时候,如果有新的连接进来,IoService会产生sessionOpened这样一个事件

广义上来讲,基于Mina的应用程序可以划分为三层:
1)IoService:I/O服务,执行实际的I/O通信。
2)IoFilterChain:I/O过滤器链,把字节过滤/转换成所需的数据结构,反之亦然。
3)IoHandler:I/O句柄,放置实际的业务逻辑。
因此,要想创建基于Mina的应用程序,你必须依次创建以上三层来处理消息
 

由于 I/O 服务执行的是输入和输出两种操作,实际上有两种具体的子类型。一种称为“I/O 接受器(IoAcceptor)”,用来接受连接,一般用在服务器的实现中;另外一种称为“I/O 连接器(IoConnector)”,用来发起连接,一般用在客户端的实现中。总之,Mina的功能如下:

体验

public class CalculatorServer {
	private static final int PORT = 10010;
	private static final Logger LOGGER = LoggerFactory.getLogger(CalculatorServer.class);

	public static void main(String[] args) throws IOException {
		// 创建连接器
		IoAcceptor acceptor = new NioSocketAcceptor();
		// 创建过滤器链
		// logger过滤器会输出所有的信息,例如新创建的会话、消息的接收、消息的发送、会话的关闭
		// codec过滤器会转换二进制或协议规定的数据为消息对象,这里是处理基于文本的消息
		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
		acceptor.getFilterChain().addLast("codec",
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		acceptor.setHandler(new CalculatorHandler());
		// 通过 bind方法来在特定的端口进行监听,接收连接。
		acceptor.bind(new InetSocketAddress(PORT));
		LOGGER.info("计算器服务已启动,端口是" + PORT);
	}
}
public class CalculatorHandler extends IoHandlerAdapter {
	private static final Logger LOGGER = LoggerFactory.getLogger(CalculatorHandler.class);
	private ScriptEngine jsEngine = null;

	public CalculatorHandler() {
		ScriptEngineManager sfm = new ScriptEngineManager();
		jsEngine = sfm.getEngineByName("JavaScript");
		if (jsEngine == null) {
			throw new RuntimeException("找不到 JavaScript 引擎。");
		}
	}

	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		LOGGER.warn(cause.getMessage(), cause);
	}

	public void messageReceived(IoSession session, Object message) throws Exception {
		String expression = message.toString();
		if ("quit".equalsIgnoreCase(expression.trim())) {
			session.close(true);
			return;
		}
		try {
			Object result = jsEngine.eval(expression);
			session.write(result.toString());
		} catch (ScriptException e) {
			LOGGER.warn(e.getMessage(), e);
			session.write("Wrong expression, try again.");
		}
	}
}

运行Dos窗口,执行连接

telnet 127.0.0.1 10010

输入任意两个数字进行运算可以检验结果

参考:Mina_2.0中文参考手册V1.0.pdf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值