zoukankan      html  css  js  c++  java
  • 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();  
        }  
    }  
  • 相关阅读:
    IQueryable & IEnumberable 区别
    修改ScriptBundle 生成顺序
    使用C#的HttpWebRequest模拟登陆网站
    XMLHttpRequest 对象
    【.Net平台下插件开发】-MEF与MAF初步调研
    MVC+UnitOfWork+Repository+EF 之我见
    关于Repository模式
    MVC中的Repository模式
    MVC Repository模式
    从Membership 到 .NET4.5 之 ASP.NET Identity
  • 原文地址:https://www.cnblogs.com/legion/p/8674330.html
Copyright © 2011-2022 走看看