美文网首页
Netty使用

Netty使用

作者: 就天边 | 来源:发表于2017-06-22 20:28 被阅读1362次

    一、Netty Server端

    • IDE和构建工具:eclipse meaven
    • Netty版本号:5.0.0.Alpha2

    1. 新建工程,通过meaven导入Netty的库包

    找到工程中的pom.xml文件,在dependencies中添加如下代码

    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>5.0.0.Alpha2</version>
    </dependency>
    

    2. 创建NettyServer

    新建NettyServer类

    package com.jiutianbian.NettyTest;
    
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelOption;
    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;
    
    public class NettyServer {
        private int port;
    
        public NettyServer(int port) {
            this.port = port;
            bind();
        }
    
        private void bind() {
            EventLoopGroup boss = new NioEventLoopGroup();
            EventLoopGroup worker = new NioEventLoopGroup();
    
            try {
                ServerBootstrap bootstrap = new ServerBootstrap();
    
                bootstrap.group(boss, worker);
                bootstrap.channel(NioServerSocketChannel.class);
                bootstrap.option(ChannelOption.SO_BACKLOG, 1024); // 连接数
                bootstrap.option(ChannelOption.TCP_NODELAY, true); // 不延迟,消息立即发送
                bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); // 长连接
                bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel socketChannel)
                            throws Exception {
                        ChannelPipeline p = socketChannel.pipeline();
                        p.addLast(new NettyServerHandler());// 添加NettyServerHandler,用来处理Server端接收和处理消息的逻辑
                    }
                });
                ChannelFuture channelFuture = bootstrap.bind(port).sync();
                if (channelFuture.isSuccess()) {
                    System.err.println("启动Netty服务成功,端口号:" + this.port);
                }
                // 关闭连接
                channelFuture.channel().closeFuture().sync();
    
            } catch (Exception e) {
                System.err.println("启动Netty服务异常,异常信息:" + e.getMessage());
                e.printStackTrace();
            } finally {
                boss.shutdownGracefully();
                worker.shutdownGracefully();
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            new NettyServer(10086);
        }
    }
    

    3. 创建NettyServerHandler,用来接收和回复Client端的消息

    新建NettyServerHandler类,用来实现Server端接收和处理消息的逻辑

    package com.jiutianbian.NettyTest;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelHandlerContext;
    
    import java.io.UnsupportedEncodingException;
    
    public class NettyServerHandler extends ChannelHandlerAdapter {
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            
            ByteBuf buf = (ByteBuf) msg;
            
            String recieved = getMessage(buf);
            System.err.println("服务器接收到客户端消息:" + recieved);
            
            try {
                ctx.writeAndFlush(getSendByteBuf("你好,客户端"));
                System.err.println("服务器回复消息:你好,客户端");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    
        /*
         * 从ByteBuf中获取信息 使用UTF-8编码返回
         */
        private String getMessage(ByteBuf buf) {
    
            byte[] con = new byte[buf.readableBytes()];
            buf.readBytes(con);
            try {
                return new String(con, "UTF8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return null;
            }
        }
        
        private ByteBuf getSendByteBuf(String message)
                throws UnsupportedEncodingException {
    
            byte[] req = message.getBytes("UTF-8");
            ByteBuf pingMessage = Unpooled.buffer();
            pingMessage.writeBytes(req);
    
            return pingMessage;
        }
    }
    

    4. 启动Server端

    Server启动后的日志输出,如下图所示


    一、Netty Client端

    1. 新建工程,通过meaven导入Netty的库包

    导入代码同上面的Server端代码

    2. 创建NettyClient

    新建NettyClient类

    package com.jiutianbian.NettyClinetTest;
    
    import io.netty.bootstrap.Bootstrap;
    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.NioSocketChannel;
    
    public class NettyClient {
    
        /*
         * 服务器端口号
         */
        private int port;
    
        /*
         * 服务器IP
         */
        private String host;
    
        public NettyClient(int port, String host) throws InterruptedException {
            this.port = port;
            this.host = host;
            start();
        }
    
        private void start() throws InterruptedException {
    
            EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
    
            try {
    
                Bootstrap bootstrap = new Bootstrap();
                bootstrap.channel(NioSocketChannel.class);
                bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
                bootstrap.group(eventLoopGroup);
                bootstrap.remoteAddress(host, port);
                bootstrap.handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel socketChannel)
                            throws Exception {
                        socketChannel.pipeline().addLast(new NettyClientHandler());
                    }
                });
                ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
                if (channelFuture.isSuccess()) {
                    System.err.println("连接服务器成功");
                }
                channelFuture.channel().closeFuture().sync();
            } finally {
                eventLoopGroup.shutdownGracefully();
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            new NettyClient(10086, "localhost");
        }
    }
    

    3. 创建NettyClientHandler,用来向Server端的发送消息并处理回复信息

    新建NettyClientHandler类,用来实现Server端接收和处理消息的逻辑

    package com.jiutianbian.NettyClinetTest;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelHandlerContext;
    
    import java.io.UnsupportedEncodingException;
    
    public class NettyClientHandler extends ChannelHandlerAdapter {
        private ByteBuf firstMessage;
    
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            byte[] data = "你好,服务器".getBytes();
            firstMessage = Unpooled.buffer();
            firstMessage.writeBytes(data);
            ctx.writeAndFlush(firstMessage);
            System.err.println("客户端发送消息:你好,服务器");
        }
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg)
                throws Exception {
            ByteBuf buf = (ByteBuf) msg;
            String rev = getMessage(buf);
            System.err.println("客户端收到服务器消息:" + rev);
        }
    
        private String getMessage(ByteBuf buf) {
            byte[] con = new byte[buf.readableBytes()];
            buf.readBytes(con);
            try {
                return new String(con, "UTF8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    

    4. 启动Client端

    Client启动后的Client端的日志输出,如下图所示



    Server端日志输出,此时如下


    相关文章

      网友评论

          本文标题:Netty使用

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