zoukankan      html  css  js  c++  java
  • MINA 学习总结

    服务端:

    package com.newyulong.upm.testmina;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;
    
    import mina.client.normal.ClientProtocolCodecFactory;
    
    import org.apache.mina.core.filterchain.IoFilter;
    import org.apache.mina.core.service.IoAcceptor;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
    import org.apache.mina.transport.socket.nio.NioSocketConnector;
    
    public class MainFrame {
        private static final int PORT = 5469;
        public static void main(String[] args) throws IOException {
            //创建主机对象
            IoAcceptor acceptor = new NioSocketAcceptor();
            //IoFilter filter = new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName( "UTF-8")));
            //acceptor.getFilterChain().addLast("vestigge", filter);
            //设置业务处理
            acceptor.setHandler(new ServerHandler());
            ClientProtocolCodecFactory cpcf = new ClientProtocolCodecFactory();
            acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(cpcf)); //设置编码过滤器
            //绑定地址
            acceptor.bind(new InetSocketAddress(PORT));
            System.out.println("服务器正在监听端口" + PORT +"...");
            
        }
    
    }

    服务端业务处理类:

    package com.newyulong.upm.testmina;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IoSession;
    
    public class ServerHandler extends IoHandlerAdapter {
        
        public void messageReceived(IoSession session, Object message)
                throws Exception {
            System.out.println("收到客户端消息:" + message.toString());
            // 服务端发送数据到客户端
            sendMsgToClient(session);
        }
        
        @Override  
        public void exceptionCaught(IoSession session, Throwable cause)  
                throws Exception {  
            System.out.println("服务器出现异常:" +cause);  
        }  
        
         public void sessionCreated(IoSession session) throws Exception {
                System.out.println("========sessionCreated==========");
            }
         
         public void sendMsgToClient(IoSession session) throws IOException
         {
            // 服务端发送数据到客户端
            System.out.println("服务端say:");
            BufferedReader bufferedReader = new BufferedReader(
             new InputStreamReader(System.in));
            String inString = bufferedReader.readLine();
            session.write(inString);
            if (inString.equals("quit")) {
             session.close(true);
            }
         }
    
    
    
    }

    客户端:

    加码和解码的工厂类

    package mina.client.normal;
    
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.ProtocolCodecFactory;
    
    public class ClientProtocolCodecFactory implements ProtocolCodecFactory {
        
        private ProtocolEncoder protocolEncoder;
        
        private ProtocolDecoder protocolDecoder;
    
        public ProtocolEncoder getEncoder(IoSession session) throws Exception {
            // TODO Auto-generated method stub
            return protocolEncoder;
        }
    
        public ProtocolDecoder getDecoder(IoSession session) throws Exception {
            // TODO Auto-generated method stub
            return protocolDecoder;
        }
        
        public ClientProtocolCodecFactory(){
            this.protocolEncoder = new ProtocolEncoder();
            this.protocolDecoder = new ProtocolDecoder();
        }
    
    }

    具体的加码的处理类

    package mina.client.normal;
    
    import org.apache.mina.core.buffer.IoBuffer;
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
    import org.apache.mina.filter.codec.ProtocolEncoderOutput;
    
    
    public class ProtocolEncoder extends ProtocolEncoderAdapter
    {
          public void encode(IoSession ioSession, Object o, ProtocolEncoderOutput protocolEncoderOutput)
            throws Exception
          {
                System.out.println("输出字符串:" + new String(o.toString().getBytes()));
                String message = (String)o;
                IoBuffer buf = IoBuffer.allocate(1000);
                buf.setAutoExpand(true);
                buf.put(message.getBytes("UTF-8"));
                buf.flip();
                System.out.println("enter in encoder ........");
    //            buf.asCharBuffer();
                protocolEncoderOutput.write(buf);
          }
        }

    解码的处理类

    package mina.client.normal;
    
    import org.apache.mina.core.buffer.IoBuffer;
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
    import org.apache.mina.filter.codec.ProtocolDecoderOutput;
    
    import com.kms.components.io.dto.IMessage;
    
    public class ProtocolDecoder extends CumulativeProtocolDecoder {
    
        @Override
        protected boolean doDecode(IoSession arg0, IoBuffer arg1,
                ProtocolDecoderOutput arg2) throws Exception {
            byte[]  returnString = arg1.array();
            System.out.println(new String(returnString));
            int limit = arg1.limit();
            byte[] data = new byte[limit];
            arg1.get(data);
            System.out.println(data);
            String returnTyped = new String(data);
            System.out.println("mmm:" + returnTyped);
            arg2.write(returnTyped);
            return true;
    
        }
    
    }

    客户端处理业务类:

    package mina.client.normal;

    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IoSession;

    public class TimeClientHandler extends IoHandlerAdapter {

        public TimeClientHandler() {
        }

        @Override
        public void messageReceived(IoSession session, Object message)
                throws Exception {
            System.out.println("客户端接受到数据:" + message);// 显示接收到的消息
        }
        //客户端创建会话
        public void sessionCreated(IoSession session) throws Exception {
            System.out.println("会话创建");
            session.write("client session create");
                // Empty handler
            
        }

    }
    测试类

    package mina.client.normal;
    
    import java.net.InetSocketAddress;
    
    import org.apache.mina.core.future.ConnectFuture;
    import org.apache.mina.core.future.ReadFuture;
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.transport.socket.nio.NioSocketConnector;
    
    public class ClientTest {
        
        public static void main(String[] args) {
            //定义客户端
            NioSocketConnector nc = new NioSocketConnector();
            
            InetSocketAddress address = new InetSocketAddress("127.0.0.1", 5469);
            TimeClientHandler tch = new TimeClientHandler();
            ClientProtocolCodecFactory cpcf = new ClientProtocolCodecFactory();
            
            
            nc.getFilterChain().addLast("codec", new ProtocolCodecFilter(cpcf)); //设置编码过滤器 
            
            nc.setHandler(tch);
            /**
            //换一种方法 此种方式可以加载多个过滤器
            /**
            DefaultIoFilterChainBuilder dcb = new DefaultIoFilterChainBuilder();
            Map map = new LinkedHashMap();
            map.put("codecFilter", new ProtocolCodecFilter(cpcf));
            dcb.setFilters(map);
            nc.setFilterChainBuilder(dcb);
            **/
            ConnectFuture cf = nc.connect(address);
            cf.awaitUninterruptibly();//等待连接创建完成
            IoSession session = cf.getSession();
            session.write("hello");//发送消息
            //cf.getSession().write("quit");//发送消息
            session.getConfig().setUseReadOperation(true);
            
            // 客户端开始读取数据
            ReadFuture readFuture = session.read();
            readFuture.awaitUninterruptibly(); 
            Object respData = readFuture.getMessage();
            session.getCloseFuture().awaitUninterruptibly();//等待连接断开
            
            System.out.println("客户端读取数据:" + (String)respData);
        }
    
    }
  • 相关阅读:
    设计模式之单例模式
    设计模式之原型模式
    设计模式之建造者模式
    设计模式之抽象方法模式
    设计模式之简单工厂模式
    java中内存分配
    java引用类型
    Oracle
    Oracle
    Oracle
  • 原文地址:https://www.cnblogs.com/working/p/3200469.html
Copyright © 2011-2022 走看看