zoukankan      html  css  js  c++  java
  • netty

    NetAssist.exe 网络调试助手

    TCP

    import com.jkinvest.constant.ConstantValue;
    import io.netty.bootstrap.ServerBootstrap;
    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.NioServerSocketChannel;
    import io.netty.handler.codec.string.StringDecoder;
    import io.netty.handler.codec.string.StringEncoder;
    import io.netty.handler.timeout.IdleStateHandler;
    import io.netty.util.ResourceLeakDetector;
    
    import java.nio.charset.Charset;
    import java.nio.charset.StandardCharsets;
    import java.util.concurrent.TimeUnit;
    
    public class TcpTest {
        public static void main(String[] args) {
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                ServerBootstrap serverBootStrap = new ServerBootstrap();
                serverBootStrap.group(bossGroup, workerGroup)
                        .channel(NioServerSocketChannel.class)
                        .option(ChannelOption.SO_BACKLOG, 1024)
                        .childHandler(new ChannelInitializer<SocketChannel>() {
                            @Override
                            protected void initChannel(SocketChannel socketChannel) throws Exception {
                                socketChannel.pipeline().addLast(new IdleStateHandler(10, 0, 0, TimeUnit.SECONDS));
                                socketChannel.pipeline().addLast(new TcpServerHandler());
                                //编码格式
                                socketChannel.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));
                                //解码格式
                                socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8));
                            }
                        });
                ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);
                ChannelFuture f = serverBootStrap.bind(ConstantValue.PORT).sync();
                System.out.println("tcp服务器正在监听......");
                f.channel().closeFuture().sync();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            }
        }
    }
    import com.jkinvest.utils.ByteUtil;
    import io.netty.buffer.ByteBuf;
    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.util.ReferenceCountUtil;
    
    public class TcpServerHandler extends ChannelHandlerAdapter {
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            ByteBuf in = (ByteBuf) msg;
            byte[] req = new byte[in.readableBytes()];
            try {
                in.readBytes(req);
            } finally {
                ReferenceCountUtil.release(msg);
            }
            String body = ByteUtil.BinaryToHexString(req);
            System.out.println("body:" + body);
        }
    }

    UDP

    import com.jkinvest.constant.ConstantValue;
    import io.netty.bootstrap.Bootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.nio.NioDatagramChannel;
    import io.netty.handler.codec.string.StringDecoder;
    import io.netty.handler.codec.string.StringEncoder;
    
    import java.nio.charset.Charset;
    import java.nio.charset.StandardCharsets;
    
    public class UdpTest {
        public static void main(String[] args) {
            EventLoopGroup group = new NioEventLoopGroup();
            try {
                Bootstrap bootstrap = new Bootstrap();
                bootstrap.group(group)
                        .channel(NioDatagramChannel.class)
                        //.option(ChannelOption.SO_BROADCAST, true)
                        .handler(new ChannelInitializer<NioDatagramChannel>() {
                                     @Override
                                     protected void initChannel(NioDatagramChannel ch) throws Exception {
                                         ch.pipeline().addLast(new UdpServerHandler());
                                         ch.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));
                                         ch.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8));
                                     }
                                 }
    
                        );
                ChannelFuture f = bootstrap.bind(ConstantValue.PORT).sync();
                System.out.println("UDP服务器正在监听......");
                f.channel().closeFuture().sync();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                group.shutdownGracefully();
            }
        }
    }
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    import io.netty.channel.socket.DatagramPacket;
    
    /**
     * @author zfang
     * @date 2020/11/10
     */
    public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
    
        @Override
        protected void messageReceived(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
            System.out.println("=====");
        }
    }

    UDP Client

    import io.netty.bootstrap.Bootstrap;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.Channel;
    import io.netty.channel.ChannelOption;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.DatagramPacket;
    import io.netty.channel.socket.nio.NioDatagramChannel;
    import io.netty.util.CharsetUtil;
    
    import java.net.InetSocketAddress;
    
    public class ChineseProverbClient {
        public void run(int port) {
            EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
            Bootstrap bootstrap = new Bootstrap();
            try {
                bootstrap.group(eventLoopGroup).channel(NioDatagramChannel.class)
                        .option(ChannelOption.SO_BROADCAST, true)
                        .handler(new ChineseProverbClientHandler());
                Channel channel = bootstrap.bind(7070).sync().channel();
                channel.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("QUERY", CharsetUtil.UTF_8), new InetSocketAddress("10.20.30.43", port))).sync();
                if (!channel.closeFuture().await(15000)) {
                    System.out.println("out of time");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                eventLoopGroup.shutdownGracefully();
            }
        }
    
        public static void main(String[] args) {
            new ChineseProverbClient().run(3888);
        }
    }
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    import io.netty.channel.socket.DatagramPacket;
    import io.netty.util.CharsetUtil;
    
    public class ChineseProverbClientHandler extends SimpleChannelInboundHandler<DatagramPacket> {
        @Override
        protected void messageReceived(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) throws Exception {
            String result = datagramPacket.content().toString(CharsetUtil.UTF_8);
            System.out.println("client>>>" + result);
            channelHandlerContext.close();
        }
    }
  • 相关阅读:
    JavaEE基础(01):Servlet实现方式,生命周期执行过程
    Spring 框架基础(06):Mvc架构模式简介,执行流程详解
    Spring 框架基础(05):事务管理机制,和实现方式
    多线程搜索与排序
    mybatis的Mapper代理原理
    spring的RestTemplate使用指南
    探索CAS无锁技术
    两年Java的面试经验
    HashMap多线程并发的问题
    解析Mybaits的insert方法返回数字-2147482646的原因
  • 原文地址:https://www.cnblogs.com/xiaomaoyvtou/p/13917701.html
Copyright © 2011-2022 走看看