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);
        }
    
    }
  • 相关阅读:
    metal的gpu query
    体积雾 global fog unity 及改进
    hdr rt format对颜色的影响
    unity deferred lighting
    unity linear space时 photoshop blend的正确设置
    unity linear work flow
    一些数据 bandwidth之类
    deferred rendering with msaa
    unity 显示mipmaplevel
    【转】在C#中使用SendMessage
  • 原文地址:https://www.cnblogs.com/working/p/3200469.html
Copyright © 2011-2022 走看看