• netty使用(7)传输一个序列化对象


    Server代码

    package club.test;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.List;
    
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelOption;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    import io.netty.handler.codec.ByteToMessageDecoder;
    //必须实现Serializable接口
    class Person implements Serializable{
        private static final long    serialVersionUID    = 1L;
        private String    name;
        private String    sex;
        private int        age;
    
        public String toString() {
            return "name:" + name + " sex:" + sex + " age:" + age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    
    public class HttpServer
    {
        public void start(int port) throws Exception {
            EventLoopGroup bossGroup = new NioEventLoopGroup(); 
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                ServerBootstrap b = new ServerBootstrap(); 
                b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) 
                        .childHandler(new ChannelInitializer<SocketChannel>() { 
                                    @Override
                                    public void initChannel(SocketChannel ch) throws Exception {
                                        ch.pipeline().addLast(new PersonDecoder());
                                        ch.pipeline().addLast(new BusinessHandler());
                                    }
                                }).option(ChannelOption.SO_BACKLOG, 128) 
                        .childOption(ChannelOption.SO_KEEPALIVE, true); 
    
                ChannelFuture f = b.bind(port).sync(); 
    
                f.channel().closeFuture().sync();
            } finally {
                workerGroup.shutdownGracefully();
                bossGroup.shutdownGracefully();
            }
        }
    
        public static void main(String[] args) throws Exception {
            HttpServer server = new HttpServer();
            server.start(8000);
        }
    }
    class PersonDecoder extends ByteToMessageDecoder {
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
            System.out.println("Person Decoder called...");
            ByteBufToBytes read = new ByteBufToBytes();
            Object obj = ByteObjConverter.ByteToObject(read.read(in));
            out.add(obj);
        }
    
    }
    class BusinessHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            Person person = (Person) msg;
            System.out.println("BussinessHandler called and...");
            System.out.println("Person is:"+person);
            //logger.info("BusinessHandler read msg from client :" + person);
        }
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
            System.out.println("read complete called...");
            ctx.flush();
        }
        
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            
        }
    }
    class ByteObjConverter {
        public static Object ByteToObject(byte[] bytes) {
            Object obj = null;
            ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
            ObjectInputStream oi = null;
            try {
                oi = new ObjectInputStream(bi);
                obj = oi.readObject();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bi.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    oi.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return obj;
        }
    
        public static byte[] ObjectToByte(Object obj) {
            byte[] bytes = null;
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            ObjectOutputStream oo = null;
            try {
                oo = new ObjectOutputStream(bo);
                oo.writeObject(obj);
                bytes = bo.toByteArray();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bo.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    oo.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return (bytes);
        }
    }
    class ByteBufToBytes {
        private ByteBuf    temp;
    
        private boolean    end    = true;
    
        public ByteBufToBytes(int length) {
            temp = Unpooled.buffer(length);
        }
    
        public ByteBufToBytes() {
            // TODO Auto-generated constructor stub
        }
    
        public void reading(ByteBuf datas) {
            datas.readBytes(temp, datas.readableBytes());
            if (this.temp.writableBytes() != 0) {
                end = false;
            } else {
                end = true;
            }
        }
    
        public boolean isEnd() {
            return end;
        }
    
        public byte[] readFull() {
            if (end) {
                byte[] contentByte = new byte[this.temp.readableBytes()];
                this.temp.readBytes(contentByte);
                this.temp.release();
                return contentByte;
            } else {
                return null;
            }
        }
    
        public byte[] read(ByteBuf datas) {
            byte[] bytes = new byte[datas.readableBytes()];
            datas.readBytes(bytes);
            return bytes;
        }
    }

    Client代码

    package club.test;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    import io.netty.bootstrap.Bootstrap;
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelOption;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.channel.socket.nio.NioSocketChannel;
    import io.netty.handler.codec.MessageToByteEncoder;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    class Person implements Serializable{
        private static final long    serialVersionUID    = 1L;
        private String    name;
        private String    sex;
        private int        age;
    
        public String toString() {
            return "name:" + name + " sex:" + sex + " age:" + age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    public class HttpClient {
        public void connect(String host, int port) throws Exception {
            EventLoopGroup workerGroup = new NioEventLoopGroup();
    
            try {
                Bootstrap b = new Bootstrap(); 
                b.group(workerGroup); 
                b.channel(NioSocketChannel.class); 
                b.option(ChannelOption.SO_KEEPALIVE, true); 
                b.handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new PersonEncoder());
                        ch.pipeline().addLast(new ClientInitHandler());
                    }
                });
    
                ChannelFuture f = b.connect(host, port).sync();
                f.channel().closeFuture().sync();
            } finally {
                workerGroup.shutdownGracefully();
            }
    
        }
    
        public static void main(String[] args) throws Exception {
            HttpClient client = new HttpClient();
            client.connect("127.0.0.1", 8000);
        }
    }
    
    
     class ClientInitHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("client channel active");
            Person person = new Person();
            person.setName("Lannister");
            person.setSex("man");
            person.setAge(30);
            ctx.write(person);
            ctx.flush();
        }
    }
     class PersonEncoder extends MessageToByteEncoder<Person> {
    
        @Override
        protected void encode(ChannelHandlerContext ctx, Person msg, ByteBuf out) throws Exception {
            byte[] datas = ByteObjConverter.ObjectToByte(msg);
            System.out.println("Person Encoder called...");
            out.writeBytes(datas);
            ctx.flush();
        }
    }
     class ByteObjConverter {
            public static Object ByteToObject(byte[] bytes) {
                Object obj = null;
                ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
                ObjectInputStream oi = null;
                try {
                    oi = new ObjectInputStream(bi);
                    obj = oi.readObject();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        bi.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        oi.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return obj;
            }
    
            public static byte[] ObjectToByte(Object obj) {
                byte[] bytes = null;
                ByteArrayOutputStream bo = new ByteArrayOutputStream();
                ObjectOutputStream oo = null;
                try {
                    oo = new ObjectOutputStream(bo);
                    oo.writeObject(obj);
                    bytes = bo.toByteArray();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        bo.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        oo.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return (bytes);
            }
        }
        class ByteBufToBytes {
            private ByteBuf    temp;
    
            private boolean    end    = true;
    
            public ByteBufToBytes(int length) {
                temp = Unpooled.buffer(length);
            }
    
            public ByteBufToBytes() {
                // TODO Auto-generated constructor stub
            }
    
            public void reading(ByteBuf datas) {
                datas.readBytes(temp, datas.readableBytes());
                if (this.temp.writableBytes() != 0) {
                    end = false;
                } else {
                    end = true;
                }
            }
    
            public boolean isEnd() {
                return end;
            }
    
            public byte[] readFull() {
                if (end) {
                    byte[] contentByte = new byte[this.temp.readableBytes()];
                    this.temp.readBytes(contentByte);
                    this.temp.release();
                    return contentByte;
                } else {
                    return null;
                }
            }
    
            public byte[] read(ByteBuf datas) {
                byte[] bytes = new byte[datas.readableBytes()];
                datas.readBytes(bytes);
                return bytes;
            }
        }

    程序运行输出

    客户端

    client channel active
    Person Encoder called...

    服务端

    Person Decoder called...
    BussinessHandler called and...
    Person is:name:Lannister sex:man age:30
    read complete called...

  • 相关阅读:
    事务隔离级别,数据库存储过程,Mysql视图,Mysql语句
    Spring注解; Spring Bean
    Java Thread Api
    Java 年轻代、年老代、GC
    Java 线程同步方式
    HashMap
    ArrayList
    安装zabbix环境
    线上应用——高内存占用
    Python入门笔记
  • 原文地址:https://www.cnblogs.com/legion/p/8686700.html
Copyright © 2020-2023  润新知