Mina 2.0.9 详解-1-使用
2016-01-26 16:33
369 查看
简介
Mina是一个开源java语言编写的异步NIO通讯框架,很多公司的NIO框架产品都是依据Mina开发。了解之前,先介绍如何使用。使用Mina需要在服务端和客户端各自写代码。服务端代码
创建非阻塞模式的套接字,初始化一些配置参数指定接收数据后的过滤器,对接收数据做一些处理和过滤等
指定业务处理器,处理自己的核心业务逻辑
绑定端口,启动监听,等待客户连接
public class ZMinaServer { private static final int PORT = 9257; // 定义监听端口 /** * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //创建一个非阻塞的Server端socket,用NIO IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getSessionConfig().setReadBufferSize(128); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); //创建接受数据的过滤器 DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); //设定这个过滤器将一行一行的读取数据 chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("utf-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));// 指定编码过滤器 //log LoggingFilter lf = new LoggingFilter(); lf.setSessionOpenedLogLevel(LogLevel.DEBUG); acceptor.getFilterChain().addLast("logger", lf); //myIo filter acceptor.getFilterChain().addLast("myIofilter", new ReferenceCountingFilter(new MyIoFilter())); // 指定业务逻辑处理器 acceptor.setHandler(new Handler()); // 设置端口号 acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT)); acceptor.bind(); //启动监听 System.out.println("Mina Server is Listen ON:" + PORT); } }
上述代码中,有一个读数据的编码过滤器,有一个日志过滤器,还有一个自己实现的过滤器,代码如下:
public class MyIoFilter implements IoFilter { public void destroy() throws Exception { System.out.println("dstroy"); } public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception { System.out.println("exceptionCaught"); nextFilter.exceptionCaught(session, cause); } public void filterClose(NextFilter nextFilter, IoSession session) throws Exception { System.out.println("filterClose"); nextFilter.filterClose(session); } public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { System.out.println("filterWrite"); nextFilter.filterWrite(session, writeRequest); } public void init() throws Exception { System.out.println("init"); } public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception { System.out.println("messageReceived"); nextFilter.messageReceived(session, message); } public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { System.out.println("messageSent"); nextFilter.messageSent(session, writeRequest); } public void onPostAdd(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception { System.out.println("onPostAdd"); } public void onPostRemove(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception { System.out.println("onPostRemove"); } public void onPreAdd(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception { System.out.println("onPreAdd"); } public void onPreRemove(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception { System.out.println("onPreRemove"); } public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception { System.out.println("sessionClosed"); nextFilter.sessionClosed(session); } public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception { System.out.println("sessionCreated"); nextFilter.sessionCreated(session); } public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception { System.out.println("sessionIdle"); nextFilter.sessionIdle(session, status); } public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception { System.out.println("sessionOpened"); nextFilter.sessionOpened(session); } /** * @see org.apache.mina.core.filterchain.IoFilter#inputClosed(org.apache.mina.core.filterchain.IoFilter.NextFilter, org.apache.mina.core.session.IoSession) */ public void inputClosed(NextFilter nextFilter, IoSession session) throws Exception { } }
核心业务逻辑是给客户返回当前时间,其实现如下:
public class Handler extends IoHandlerAdapter { //当一个客户端连接进入时 @Override public void sessionOpened(IoSession session) throws Exception { System.out.println("incoming client:" + session.getRemoteAddress()); } //当客户端发送消息到达时 @Override public void messageReceived(IoSession session, Object message) throws Exception { String s = message.toString(); System.out.println("client send message is:" + s); if ("quit".equals(s)) { session.close(); } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd mm:hh:ss"); Date date = new Date(); session.write(sdf.format(date));// 返回当前时间的字符串 } //当一个客户端连接关闭时 @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("one client closed"); } }
Client 代码
创建一个Connector指定发送数据的过滤器
指定客户端的业务处理逻辑
指定监听器
public class ZMinaClient { /** * * @param args */ public static void main(String[] args) { IoConnector connector = new NioSocketConnector(); connector.setConnectTimeoutMillis(3000); connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); connector.setHandler(new ClientHandler()); ConnectFuture connectFuture = connector.connect(new InetSocketAddress("localhost", 9257)); //add listenner connectFuture.addListener(new IoFutureListener<ConnectFuture>() { public void operationComplete(ConnectFuture future) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } IoSession session = future.getSession(); System.out.println("sesson:" + session.getTransportMetadata().getName()); } }); //test System.out.println("########"); } }
其业务逻辑处理是向sever端发送数据,代码如下:
public class ClientHandler extends IoHandlerAdapter { private String values; public ClientHandler() { } @Override public void sessionOpened(IoSession session) { this.values = "hello,zhoupj!"; System.out.println("send:" + values); session.write(values); } //当Server消息到达时 @Override public void messageReceived(IoSession session, Object message) throws Exception { String s = message.toString(); System.out.println("client receives:" + s); } }
相关文章推荐
- 插件管理框架 for Delphi(一)
- 使用CSS框架布局的缺点和优点小结
- 列举PHP的Yii 2框架的开发优势
- Windows窗体的.Net框架绘图技术实现方法
- 浅谈JavaScript 框架分类
- 轻量级javascript 框架Backbone使用指南
- javascript实现框架高度随内容改变的方法
- JS刷新框架外页面七种实现代码
- 超赞的动手创建JavaScript框架的详细教程
- 深入探讨前端框架react
- 简单介绍不用库(框架)自己写ajax
- asp.net4.0框架下验证机制失效的原因及处理办法
- 插件管理框架 for Delphi(二)
- 零基础学习AJAX之AJAX框架
- Ajax 框架学习笔记
- Flex中最好的MVC框架Mate框架
- JavaScript 异步调用框架 (Part 4 - 链式调用)
- JavaScript 异步调用框架 (Part 2 - 用例设计)
- 为什么使用框架 使用框架的优缺点
- JavaScript 异步调用框架 (Part 3 - 代码实现)