zoukankan      html  css  js  c++  java
  • Netty4.X 学习(一)

    Server:

    import io.netty.buffer.ByteBuf;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    import io.netty.util.CharsetUtil;
    import io.netty.util.ReferenceCountUtil;
    
    import com.netty.utils.*;
    
    public class HelloServerHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            Log.logInfo(">>>>>> I'm server.");
            // System.out.println(">>>>>> I'm server.");
            String msg = "Hello world
    ";
            ByteBuf encoded = ctx.alloc().buffer(msg.length());
            encoded.writeBytes(msg.getBytes());
            ctx.write(encoded);
            ctx.flush();
        }
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg)
                throws Exception {
            //Log.logInfo("server receive message:" + msg);
            // System.out.println("服务器收到的消息:" + msg);
            ByteBuf in = (ByteBuf) msg;
            try {
                if (in.isReadable()) { // (1)
                    String str = in.toString(CharsetUtil.US_ASCII);
                    Log.logInfo("server receive message:" + str);
                }
            } finally {
                ReferenceCountUtil.release(msg); // (2)
            }
    
        }
    }
    package com.netty.example.PrintHello;
    
    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;
    
    public class HelloWorldServer {
        public static void main(String[] args) {
            //EventLoop 代替原来的 ChannelFactory
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                ServerBootstrap serverBootstrap = new ServerBootstrap();
                // server端采用简洁的连写方式,client端才用分段普通写法。
                serverBootstrap.group(bossGroup, workerGroup)
                        .channel(NioServerSocketChannel.class)
                        .childHandler(new ChannelInitializer<SocketChannel>() {
                            @Override
                            public void initChannel(SocketChannel ch)
                                    throws Exception {
                                ch.pipeline().addLast(new HelloServerHandler());
                            }
                        }).option(ChannelOption.SO_KEEPALIVE, true);
    
                ChannelFuture f = serverBootstrap.bind(8000).sync();
                f.channel().closeFuture().sync();
                System.out.println("TCP服务器已启动");
            } catch (InterruptedException e) {
            } finally {
                workerGroup.shutdownGracefully();
                bossGroup.shutdownGracefully();
            }
        }
    }

    运行后可以在终端直接通过telnet命令连接:

    telnet localhost 8000

    client:

    package com.netty.example.PrintHello;
    import io.netty.buffer.ByteBuf;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    import io.netty.util.ReferenceCountUtil;
    
    public class HelloClientHandler  extends ChannelInboundHandlerAdapter{
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println(">>>>> I'm client.");
    //        ctx.write("Hello world!");
    //        ctx.flush();
            String msg = "Are you ok?";  
            ByteBuf encoded = ctx.alloc().buffer(msg.length());  
            encoded.writeBytes(msg.getBytes());  
            ctx.write(encoded);  
            ctx.flush(); 
        }
        
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg)  throws Exception{
            ByteBuf in = (ByteBuf) msg;
            try {
                while (in.isReadable()) { // (1)
                    System.out.println("client收到服务器的消息:" + msg);
                    System.out.print((char) in.readByte());
                    System.out.flush();
                }
            } finally {
                ReferenceCountUtil.release(msg); // (2)
            }
        }
    }
    package com.netty.example.PrintHello;
    
    import java.net.InetSocketAddress;
    
    import io.netty.bootstrap.Bootstrap;
    import io.netty.bootstrap.ServerBootstrap;
    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.NioServerSocketChannel;
    import io.netty.channel.socket.nio.NioSocketChannel;
    
    public class HelloWorldClient {
        public static void main(String[] args) {
            // Client服务启动器 3.x的ClientBootstrap 改为Bootstrap,且构造函数变化很大,这里用无参构造。
            Bootstrap bootstrap = new Bootstrap();
            // 指定channel类型
            bootstrap.channel(NioSocketChannel.class);
            // 指定Handler
            bootstrap.handler(new HelloClientHandler());
            // 指定EventLoopGroup
            bootstrap.group(new NioEventLoopGroup());
            // 连接到本地的8000端口的服务端
            bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));
        }
    }
  • 相关阅读:
    ThinkPHP 3.2.2 实现持久登录 ( 记住我 )
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 17 电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/csu_xajy/p/3845266.html
Copyright © 2011-2022 走看看