zoukankan      html  css  js  c++  java
  • 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V2 -- 对象传输

     网络编程 -- RPC实现原理 -- 目录

      啦啦啦

    V2——Netty -- 使用序列化和反序列化在网络上传输对象:需要实现 java.io.Serializable 接口

     只能传输( ByteBuf, FileRegion )两种类型,因此必须将对象在发送之前进行序列化,放进ByteBuf中,客户端接收到ByteBuf时,将字节码取出,反序列化成对象。

     

      Class : Server

    package lime.pri.limeNio.netty.netty02.exercise;
    
    import java.net.InetSocketAddress;
    import java.util.Date;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.buffer.ByteBuf;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelFutureListener;
    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelPipeline;
    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.util.CharsetUtil;
    import lime.pri.limeNio.netty.netty03.entity.User;
    
    public class Server {
    
        public static void main(String[] args) throws Exception {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            EventLoopGroup boss = new NioEventLoopGroup();
            EventLoopGroup worker = new NioEventLoopGroup();
            serverBootstrap.group(boss, worker);
            serverBootstrap.channel(NioServerSocketChannel.class);
            serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
    
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline pipeline = ch.pipeline();
                    pipeline.addLast(new ChannelHandlerAdapter(){
    
                        @Override
                        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                            ByteBuf byteBuf = (ByteBuf) msg;
                            String request = byteBuf.toString(CharsetUtil.UTF_8);
                            System.out.println("客户端请求数据:" + request);
                            
                            String response = JSON.toJSONString("请求参数不正确",SerializerFeature.WriteClassName);
                            if("Query Date".equalsIgnoreCase(request)){
                                response = JSON.toJSONString("当前系统时间:" + new Date().toString(),SerializerFeature.WriteClassName);
                            }else if("Query User".equalsIgnoreCase(request)){
                                response = JSON.toJSONString(new User(1,"lime",new Date()), SerializerFeature.WriteClassName);
                            }
                            
                            byteBuf.clear();
                            byteBuf.writeBytes(response.getBytes(CharsetUtil.UTF_8));
                            ChannelFuture channelFuture = ctx.writeAndFlush(byteBuf);
                            channelFuture.addListener(ChannelFutureListener.CLOSE);
                        }
                        
                    });
                }
    
            });
            ChannelFuture channelFuture = serverBootstrap.bind(new InetSocketAddress(9999)).sync();
            channelFuture.channel().closeFuture().sync();
            boss.close();
            worker.close();
        }
    }

      Class : Client

    package lime.pri.limeNio.netty.netty02.exercise;
    
    import java.net.InetSocketAddress;
    
    import com.alibaba.fastjson.JSON;
    
    import io.netty.bootstrap.Bootstrap;
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelPipeline;
    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.util.CharsetUtil;
    
    public class Client {
    
        public static void main(String[] args) throws Exception {
            for (int i = 0; i < 10; i++) {
                new Thread() {
                    {
                        setDaemon(false);
                    }
    
                    public void run() {
                        try {
                            client();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    };
                }.start();
            }
        }
    
        private static void client() throws Exception {
            Bootstrap bootstrap = new Bootstrap();
            EventLoopGroup worker = new NioEventLoopGroup();
            bootstrap.group(worker);
            bootstrap.channel(NioSocketChannel.class);
            bootstrap.handler(new ChannelInitializer<SocketChannel>() {
    
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline pipeline = ch.pipeline();
                    pipeline.addLast(new ChannelHandlerAdapter() {
    
                        /**
                         * 默认只捕获网络连接异常
                         */
                        @Override
                        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
                            System.out.println(cause);
                        }
    
                        @Override
                        public void channelActive(ChannelHandlerContext ctx) throws Exception {
                            String request = null;
                            switch ((int) (Math.random() * 10) % 3) {
                            case 0:
                                request = "Query Date";
                                break;
                            case 1:
                                request = "Query User";
                                break;
    
                            default:
                                request = "Query What?";
                                break;
                            }
                            ctx.writeAndFlush(Unpooled.buffer().writeBytes(request.getBytes(CharsetUtil.UTF_8)));
                        }
    
                        @Override
                        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                            ByteBuf byteBuf = (ByteBuf) msg;
                            System.out.println("服务端响应数据 --> " + JSON.parse(byteBuf.toString(CharsetUtil.UTF_8)));
                        }
    
                    });
                }
            });
            ChannelFuture channelFuture;
    
            channelFuture = bootstrap.connect(new InetSocketAddress(9999)).sync();
            channelFuture.channel().closeFuture().sync();
            worker.close();
        }
    }

      Console : Server

    客户端请求数据:Query What?
    客户端请求数据:Query User
    客户端请求数据:Query User
    客户端请求数据:Query Date
    客户端请求数据:Query Date
    客户端请求数据:Query What?
    客户端请求数据:Query Date
    客户端请求数据:Query Date
    客户端请求数据:Query User
    客户端请求数据:Query User

      Console : Client

    服务端响应数据 --> 当前系统时间:Sat Jun 24 18:21:40 CST 2017
    服务端响应数据 --> 请求参数不正确
    服务端响应数据 --> 当前系统时间:Sat Jun 24 18:21:40 CST 2017
    服务端响应数据 --> 请求参数不正确
    服务端响应数据 --> 当前系统时间:Sat Jun 24 18:21:40 CST 2017
    服务端响应数据 --> 当前系统时间:Sat Jun 24 18:21:40 CST 2017
    服务端响应数据 --> User [id=1, name=lime, birth=Sat Jun 24 18:21:40 CST 2017]
    服务端响应数据 --> User [id=1, name=lime, birth=Sat Jun 24 18:21:40 CST 2017]
    服务端响应数据 --> User [id=1, name=lime, birth=Sat Jun 24 18:21:40 CST 2017]
    服务端响应数据 --> User [id=1, name=lime, birth=Sat Jun 24 18:21:40 CST 2017]

    啦啦啦

  • 相关阅读:
    .NET的堆和栈01,基本概念、值类型内存分配
    C#中List<T>是怎么存放元素的
    MVC为用户创建专属文件夹
    c#中何时使用Empty()和DefalutIfEmpty()
    MVC中使用AngularJS-01,基本
    MVC使用Dotnet.HighCharts做图表01,区域图表
    MVC使用Gantt Chart实现甘特图,管理事情进度
    Knockout官网实例在MVC下的实现-02,实现计次
    MVC实现多选下拉框,保存并显示多选项
    Knockout官网实例在MVC下的实现-01,实现Hello world
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/7074237.html
Copyright © 2011-2022 走看看