• netty使用(5)client_server一发一回阐释ByteBuffer的使用


    Client 连接 发送一句问候,Server打印Client的问候,返回

    I am ok!后关闭连接,Client打印Server发送的I am ok!

     Server代码

    package simpleDialogServer;
    
    import io.netty.bootstrap.ServerBootstrap;  
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelFutureListener;
    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.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerContext;  
    import io.netty.channel.ChannelInboundHandlerAdapter;  
    
      
    public class HelloServer {  
        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 {  
                                // 注册handler  
                                ch.pipeline().addLast(new HelloServerInHandler());  
                            }  
                        }).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 {  
            HelloServer server = new HelloServer();  
            server.start(8000);  
        }  
    }
    
    // 该handler是InboundHandler类型  
    class HelloServerInHandler extends ChannelInboundHandlerAdapter {  
        
        @Override  
        public void channelRead(ChannelHandlerContext ctx, Object msg)  
                throws Exception {  
            
            ByteBuf result = (ByteBuf) msg;  
            byte[] result1 = new byte[result.readableBytes()];  
            // msg中存储的是ByteBuf类型的数据,把数据读取到byte[]中  
            result.readBytes(result1);  
            String resultStr = new String(result1);  
            // 接收并打印客户端的信息  
            System.out.println("Client said:" + resultStr);  
            // 释放资源,这行很关键  
            result.release();  
      
            // 向客户端发送消息  
            String response = "I am ok!";  
            // 在当前场景下,发送的数据必须转换成ByteBuf数组  
            ByteBuf encoded = ctx.alloc().buffer(4 * response.length());  
            encoded.writeBytes(response.getBytes());  
            ctx.write(encoded);  
            ctx.flush();  
        }  
      
        @Override  
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {  
            ctx.flush();
            ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
            .addListener(ChannelFutureListener.CLOSE);
        }  
    }  

    Client代码

    package simpleDialogClient;
    import io.netty.bootstrap.Bootstrap;
    import io.netty.buffer.ByteBuf;
    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.NioSocketChannel;  
    
    public class HelloClient {  
      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 HelloClientIntHandler());  
                  }  
              });  
    
              // Start the client.  
              ChannelFuture f = b.connect(host, port).sync();  
    
              // Wait until the connection is closed.  
              f.channel().closeFuture().sync();  
          } finally {  
              workerGroup.shutdownGracefully();  
          }  
    
      }  
      public static void main(String[] args) throws Exception {  
          HelloClient client = new HelloClient();  
          client.connect("127.0.0.1", 8000);  
      }  
    }  
    class HelloClientIntHandler extends ChannelInboundHandlerAdapter {  
        // 接收server端的消息,并打印出来  
        @Override  
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {  
            
            ByteBuf result = (ByteBuf) msg;  
            byte[] result1 = new byte[result.readableBytes()];  
            result.readBytes(result1);  
            System.out.println("Server said:" + new String(result1));  
            result.release();  
        }  
        // 连接成功后,向server发送消息  
        @Override  
        public void channelActive(ChannelHandlerContext ctx) throws Exception {  
            
            String msg = "Are you ok?";  
            ByteBuf encoded = ctx.alloc().buffer(4 * msg.length());  
            encoded.writeBytes(msg.getBytes());  
            ctx.write(encoded);  
            ctx.flush();  
        }  
    }  
  • 相关阅读:
    Entity Framework中的多个库操作批量提交、事务处理
    Entity Framework with NOLOCK
    在Entity Framework 中执行T-sql语句
    Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)
    Visual Studio 2010 更新NuGet Package Manager出错解决办法
    html判断IE版本
    Java基础-学习笔记(七)——this关键字
    Java基础-学习笔记(六)——类的封装性
    Java基础-学习笔记(五)——面向过程和面向对象的区别
    Java基础-学习笔记(四)-流程控制
  • 原文地址:https://www.cnblogs.com/legion/p/8674330.html
Copyright © 2020-2023  润新知