• java socket 多线程通讯 使用mina作为服务端


    客户端代码不变,参照 http://www.cnblogs.com/Westfalen/p/6251473.html

    服务端代码如下:

    import java.io.IOException;
    import java.net.InetSocketAddress;
    
    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IdleStatus;
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
    
    /**
     * 使用mina作为服务器进行socket通讯
     * 
     * 需要jar包: mina-core-2.0.16.jar, slf4j-api-1.7.21.jar
     * jar包下载地址 : http://mina.apache.org/downloads-mina.html 
     *
     */
    public class MinaServer {
        public static void main(String[] args) {
            try {
                // 4步操作
                // 1.新建 NioSocketAcceptor 事例对象
                NioSocketAcceptor acceptor = new NioSocketAcceptor();
                // 2.设置消息处理对象
                acceptor.setHandler(new MyServerHandler());
                // 3.设置消息解码器
                acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyTextLineFactory()));// acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);
                // //设置idle时长
                // 4.绑定端口开启服务
                acceptor.bind(new InetSocketAddress(9999));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 专门处理消息的类,实现网络连接和消息处理的解耦
     */
    class MyServerHandler extends IoHandlerAdapter {
    
        /** 异常时候的处理 */
        @Override
        public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
            System.out.println("exceptionCaught");
        }
    
        /** 收到消息 */
        @Override
        public void messageReceived(IoSession session, Object message) throws Exception {
            System.out.println("messageReceived " + message);
            // session.write("reply " + message); //收到消息就马上把消息回送给客户端
        }
    
        /** 发送消息 */
        @Override
        public void messageSent(IoSession session, Object message) throws Exception {
            System.out.println("messageSent " + message);
        }
    
        /** 通讯闲置时候的处理 */
        @Override
        public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
            System.out.println("sessionIdle");
        }
    }
    package de.bvb.server;
    
    import java.nio.charset.Charset;
    import java.nio.charset.CharsetEncoder;
    
    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.ProtocolCodecFactory;
    import org.apache.mina.filter.codec.ProtocolDecoder;
    import org.apache.mina.filter.codec.ProtocolDecoderOutput;
    import org.apache.mina.filter.codec.ProtocolEncoder;
    import org.apache.mina.filter.codec.ProtocolEncoderOutput;
    
    public class MyTextLineFactory implements ProtocolCodecFactory {
        private ProtocolEncoder encoder;
        private ProtocolDecoder decoder;
    
        public MyTextLineFactory() {
            encoder = new MyTextLineEncoder();
            decoder = new MyCumulativeProtocolDecoder();
        }
    
        @Override
        public ProtocolEncoder getEncoder(IoSession session) throws Exception {
            return encoder;
        }
    
        @Override
        public ProtocolDecoder getDecoder(IoSession session) throws Exception {
            return decoder;
        }
    }
    
    class MyTextLineEncoder implements ProtocolEncoder {
    
        @Override
        public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
            // 编码格式
            CharsetEncoder charsetEncoder = (CharsetEncoder) session.getAttribute("encoder");
            if (charsetEncoder == null) {
                charsetEncoder = Charset.defaultCharset().newEncoder();
                session.setAttribute("encoder", charsetEncoder);
            }
            String value = (message == null ? "" : message.toString());
            IoBuffer buffer = IoBuffer.allocate(value.length()).setAutoExpand(true);
            buffer.putString(value, charsetEncoder);
            buffer.flip();
            out.write(buffer);
        }
    
        @Override
        public void dispose(IoSession session) throws Exception {
    
        }
    }
    
    class MyCumulativeProtocolDecoder extends CumulativeProtocolDecoder {
    
        @Override
        protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
            int startPosition = in.position();
            while (in.hasRemaining()) {
                byte b = in.get();
                if (b == '
    ') {
                    int currentPosition = in.position();
                    int limit = in.limit();
                    in.position(startPosition);
                    in.limit(currentPosition);
                    IoBuffer buffer = in.slice();
                    byte[] dest = new byte[buffer.limit()];
                    buffer.get(dest);
                    String str = new String(dest);
                    out.write(str);
                    in.position(currentPosition);
                    in.limit(limit);
                    return true;
                }
            }
            in.position(startPosition);
            return false;
        }
    
    }
  • 相关阅读:
    Android:Service的非绑定式的创建和生命周期
    [NHibernate]缓存(NHibernate.Caches)
    [NHibernate]Parent/Child
    [NHibernate]关联映射
    [NHibernate]集合类(Collections)映射
    [NHibernate]O/R Mapping基础
    [NHibernate]持久化类(Persistent Classes)
    [js]uploadify结合jqueryUI弹出框上传,js中的冒出的bug,又被ie坑了
    [NHibernate]ISessionFactory配置
    [Nhibernate]体系结构
  • 原文地址:https://www.cnblogs.com/Westfalen/p/6252555.html
Copyright © 2020-2023  润新知