美文网首页netty
Netty应答服务

Netty应答服务

作者: rainbowz | 来源:发表于2022-02-16 16:38 被阅读0次

    需求:服务端接收客户端发送的数据,并将数据返回给客户端

    • 客户端代码
    
    public final class EchoClient {
    
        public static void main(String[] args) {
            try {
                NioEventLoopGroup group = new NioEventLoopGroup();
                Channel channel = new Bootstrap()
                        .group(group)
                        .channel(NioSocketChannel.class)
                        .handler(new ChannelInitializer<NioSocketChannel>() {
                            @Override
                            protected void initChannel(NioSocketChannel ch) throws Exception {
                                //添加handler
                                ChannelPipeline p = ch.pipeline();
                                p.addLast(new LoggingHandler(LogLevel.DEBUG));
                                ch.pipeline().addLast(new StringEncoder()); //bytebuf转为字符串
                                ch.pipeline().addLast(new StringDecoder()); //bytebuf转为字符串
                                ch.pipeline().addLast(new EchoClientHandler()); //bytebuf转为字符串
    
                            }
                        }).connect(new InetSocketAddress("localhost", 8007))
                        .sync()
                        .channel();
                new Thread(() -> {
                    Scanner scanner = new Scanner(System.in);
                    while (true) {
                        String line = scanner.nextLine();
                        if ("q".equals(line)) {
                            channel.close();
                            // log.debug("处理关闭之后操作");
                            break;
                        }
                        channel.writeAndFlush(line);
                    }
                }, "input_client").start();
    
                //  方法①获取closeFuture对象
               /* ChannelFuture closeFuture = channel.closeFuture();
                log.debug("waiting close");
                closeFuture.sync();
                log.debug("处理关闭之后操作");*/
    
                ChannelFuture closeFuture = channel.closeFuture();
                closeFuture.addListener((ChannelFutureListener) future -> {
                    group.shutdownGracefully();//线程组停下来
                });
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    
    • 客户端handler
    /*
     * Copyright 2012 The Netty Project
     *
     * The Netty Project licenses this file to you under the Apache License,
     * version 2.0 (the "License"); you may not use this file except in compliance
     * with the License. You may obtain a copy of the License at:
     *
     *   https://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     * License for the specific language governing permissions and limitations
     * under the License.
     */
    package io.netty.example.echo;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    
    import java.nio.charset.Charset;
    
    /**
     * Handler implementation for the echo client.  It initiates the ping-pong
     * traffic between the echo client and server by sending the first message to
     * the server.
     */
    public class EchoClientHandler extends ChannelInboundHandlerAdapter {
    
        private  ByteBuf firstMessage;
    
        /**
         * Creates a client-side handler.
         */
        public EchoClientHandler() {
          /*  firstMessage = Unpooled.buffer(EchoClient.SIZE);
            for (int i = 0; i < firstMessage.capacity(); i ++) {
                firstMessage.writeByte((byte) i);
            }*/
        }
    
        @Override
        public void channelActive(ChannelHandlerContext ctx) {
           // ctx.writeAndFlush(firstMessage);
        }
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            System.out.println("接受服务器的消息:"+msg);
        }
    
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) {
           ctx.flush();
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            // Close the connection when an exception is raised.
            cause.printStackTrace();
            ctx.close();
        }
    }
    
    
    • 服务端代码
    
    
    public final class EchoServer {
    
        static final boolean SSL = System.getProperty("ssl") != null;
        static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));
    
        public static void main(String[] args) throws Exception {
            // Configure SSL.
            final SslContext sslCtx;
            if (SSL) {
                SelfSignedCertificate ssc = new SelfSignedCertificate();
                sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
            } else {
                sslCtx = null;
            }
    
            // Configure the server.
            EventLoopGroup bossGroup = new NioEventLoopGroup(1);
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            final EchoServerHandler serverHandler = new EchoServerHandler();
            try {
                ServerBootstrap b = new ServerBootstrap();
                b.group(bossGroup, workerGroup)
                 .channel(NioServerSocketChannel.class)
                 .option(ChannelOption.SO_BACKLOG, 100)
                 .handler(new LoggingHandler(LogLevel.INFO))
                 .childHandler(new ChannelInitializer<SocketChannel>() {
                     @Override
                     public void initChannel(SocketChannel ch) throws Exception {
                         ChannelPipeline p = ch.pipeline();
                         p.addLast(new LoggingHandler(LogLevel.DEBUG));
    
                         if (sslCtx != null) {
                             p.addLast(sslCtx.newHandler(ch.alloc()));
    
                         }
                         p.addLast(new StringEncoder()); //bytebuf转为字符串
                         p.addLast(new StringDecoder()); //bytebuf转为字符串
                         p.addLast(serverHandler);
                     }
                 });
    
                // Start the server.
                ChannelFuture f = b.bind(PORT).sync();
    
                // Wait until the server socket is closed.
                f.channel().closeFuture().sync();
            } finally {
                // Shut down all event loops to terminate all threads.
                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            }
        }
    }
    
    
    • 服务端handler
    @Sharable
    public class EchoServerHandler extends ChannelInboundHandlerAdapter {
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            // ctx.write(msg);
            System.out.println("接受客户端的消息:" + msg);
    
            ctx.writeAndFlush(msg.toString().toUpperCase());
        }
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) {
            ctx.flush();
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            // Close the connection when an exception is raised.
            cause.printStackTrace();
            ctx.close();
        }
    }
    
    
    客户端 服务端
    参考

    netty写个应答服务

    相关文章

      网友评论

        本文标题:Netty应答服务

        本文链接:https://www.haomeiwen.com/subject/duddlrtx.html