Apache Mina网络编程研究

一、Mina的网络应用架构

       1.1 IO服务层

          用来执行实际的 I/O操作,可支持TCP/IP UDP/IP 串口 虚拟机内部管道

       1.2 IO过滤层

         用来将I/O的字节流与对象和数据结构进行转换,通过AOP 实现数据处理。

       1.3 IO处理器

         用来执行具体的业务逻辑,大多数情况下使用已有事件,定义用户处理行为。

二、Mina事件驱动的Api

     在Mina编程过程中,Mina将网络的各种活动抽象成事件,开发者可以处理其感兴趣的事件,不需要考虑底层的传输,只需要在IO处理器中处理抽象的I/O事件。

三、开发一个网络计算器

    需求:通过TCP协议,服务器处理所有客户端的计算请求,之后返回给客户机。

    服务器代码1:

   //IO处理器  

   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 (ScriptExceptione) {

           LOGGER.warn(e.getMessage(), e);

           session.write("Wrong expression, try again.");

        }

    }

}

说明:

   public void messageReceived(IoSession session,Object message)    

  该方法覆盖了IoHandlerAdapter

  当这个处理器接收到新消息的时候,该方法就会被调用。

  下面需要配置IO过滤器和IO处理器

代码2:

public classCalculatorServer {

    private static final int PORT = 10010;

    private static final Logger LOGGER =LoggerFactory.getLogger(CalculatorServer.class);

    public static void main(String[] args) throwsIOException {

        IoAcceptor acceptor =new NioSocketAcceptor(); //创建服务

       acceptor.getFilterChain().addLast("logger", newLoggingFilter());//获取IO服务的过滤器链,添加日志过滤器

       acceptor.getFilterChain().addLast( "codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset

               .forName("UTF-8")))); //添加字节流和文本流的处理

        acceptor.setHandler(newCalculatorHandler()); //设置处理器

        acceptor.bind(newInetSocketAddress(PORT)); //绑定端口

        LOGGER.info("计算器服务已启动,端口是" + PORT);

    }

}

测试:

  通过Telnet 127.0.0.1:10010 

  输入 10X10可以得到100的输出结果




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、第五课netty线程模型源码分析(二) 06、第六课netty5案例学习 07、第七课netty学习之心跳 08、第八课protocol buff学习 09.第九课自定义序列化协议之自定义序列化协议 10、第十课自定义数据包协议 11.第十一课粘包分包分析,如何避免socket攻击 12.分析设计一个聊天室的小项目 二、java NIO,AIO编程视频教程 1、java NIO,AIO编程_01.flv 2、java NIO,AIO编程_02.flv 3、java NIO,AIO编程_03.flv 4、java NIO,AIO编程_04.flv 5、java NIO,AIO编程_05.flv 三、Java语言基础教程-Java NIO流篇 [第1节] Java NIO流-简介和概述.flv [第2节] Java NIO流-缓冲区.flv [第3节] Java NIO流-缓冲区操作.flv [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv 四、Mina视频教程 00、Mina视频课程介绍.flv 01、Mina服务端helloWorld入门.flv 02、Mina客户端helloWorld入门.flv 03、Mina整体体系结构分析.flv 04、Mina学习之长短连接.flv 05、Mina学习之MinaIOService接口.flv 06、Mina学习之MinaIOFilter接口.flv 07、Mina学习之MinaIOSession接口.flv 08、Mina学习之MinaIOProcessor线程模型.flv 09、Mina学习之MinaIOBuffer接口.flv 10、Mina学习之自定义协议介绍.flv 11、Mina学习之自定义协议数据包分析.flv 12、Mina学习之自定义协议数据包实现.flv 13、Mina学习之自定义协议-编码器.flv 14、Mina学习之自定义协议-解码器.flv 15、Mina学习之自定义协议-服务端实例.flv 16、Mina学习之自定义协议-客户端实例.flv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值